Mah*_*ahi 36 c++ initialization dynamic object
什么是c ++中对象的动态初始化?
请用一个简单的例子来解释......
Naw*_*waz 49
动态初始化是在编译时不知道初始化值的情况.它在运行时计算以初始化变量.
例,
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.
Run Code Online (Sandbox Code Playgroud)
也就是说,静态初始化通常涉及常量表达式(在编译时已知),而动态初始化涉及非常量表达式.
static int c;//this is also static initialization (with zero)!
Run Code Online (Sandbox Code Playgroud)
C++标准(2003)中的§3.6.2/ 1说,
具有静态存储持续时间(3.7.1)的对象应在任何其他初始化发生之前进行零初始化(8.5).使用常量表达式进行零初始化和初始化统称为 静态初始化 ; 所有其他初始化是动态初始化.
所以有两种初始化:
另请注意,相同的变量在静态初始化后可以动态初始化.例如,请参阅以下代码:
int d = factorial(8);
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
由于它d是一个全局变量,因此它具有静态存储.这意味着,根据§3.6.2.1它在静态初始化阶段初始化为0,这发生在任何其他初始化发生之前.然后,在运行时,使用函数返回的值动态初始化它factorial().
这意味着,全局对象可以初始化两次:一次是静态初始化(零初始化),后来在运行时,可以动态初始化它们.
动态初始化是指在编译时未知内存分配后分配给变量的第一个值,仅在运行时进行评估.例如
#include <iostream.h>
using namespace std;
int sample()
{
int x;
cin >> x;
return x;
}
const int t = sample(); //dynamic initialization
int p = sample(); //dynamic initialization
void main()
{
cout << t;
cout << p;
}
Run Code Online (Sandbox Code Playgroud)
我们知道,常量只能在初始化时获得一次值.这个例子表明,如果一个全局变量是静态存储,如果通过函数的返回值动态初始化,则赋值给变量的第一个值是函数返回的值,它取代了在以下位置分配的变量的初始缺省值0.内存分配的时间.