什么是c ++中对象的动态初始化?

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().

这意味着,全局对象可以初始化两次:一次是静态初始化(零初始化),后来在运行时,可以动态初始化它们.

  • @Nawaz:请注意,有一个关于超级编译的想法,其目标是在"后期"编译阶段(实际上,可能在链接阶段)运行纯函数,以获得更快的二进制文件.我不知道C++中的任何内容(纯度没有注释......)但是Haskell已经有过各种各样的尝试. (2认同)
  • @Mahi:"谢谢Nawaz.i现在很清楚." 最能表达为帮助您最多的答案旁边的绿色勾号.参见[FAQ](http://stackoverflow.com/faq#howtoask) (2认同)

Aru*_*mar 6

动态初始化是指在编译时未知内存分配后分配给变量的第一个值,仅在运行时进行评估.例如

#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.内存分配的时间.