动态初始化是指编译时初始化值未知的初始化。它在运行时计算以初始化变量。
Example,
int factorial(int n)
{
if ( n < 0 ) return -1; //indicates input error
else if ( n == 0 ) return 1;
else return n * factorial(n-1);
}
int const a = 10 ; //static initialization
//10 is known at compile time. Its 10!
int const b = factorial(8); //dynamic initialization
//factorial(8) isn't known at compile time,
//rather it's computed at runtime.
即静态初始化usually涉及常量表达式(在编译时已知),而动态初始化涉及非常量表达式。
static int c;//this is also static initialization (with zero)!
C++ 标准 (2003) 的 §3.6.2/1 说:
具有静态存储期限的对象
(3.7.1) 应为零初始化
(8.5) 在任何其他初始化之前
发生。零初始化和
初始化与持续的
表达统称为静态初始化;所有其他
初始化是动态的
初始化.
所以有两种初始化:
- 静态初始化:零初始化或使用常量表达式初始化
- 任何其他初始化都是动态初始化。
另请注意,同一变量在静态初始化后可以动态初始化。例如,请参阅以下代码:
int d = factorial(8);
int main()
{
}
Since d
是一个全局变量,它具有静态存储。这意味着,根据§3.6.2.1
它在静态初始化阶段初始化为 0在进行任何其他初始化之前。然后,在运行时,它会使用函数返回的值动态初始化factorial()
.
这意味着,全局对象可以初始化两次:一次通过静态初始化(即零初始化),然后在运行时动态初始化它们。