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

Posted

技术标签:

【中文标题】什么是 C++ 中对象的动态初始化?【英文标题】:What is dynamic initialization of object in c++? 【发布时间】:2011-08-22 04:48:03 【问题描述】:

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

请用一个简单的例子解释一下……

【问题讨论】:

@Downvoters:这个问题有什么问题? 我想它的教科书性质。 【参考方案1】:

动态初始化是在编译时不知道初始化值的初始化。它在运行时计算以初始化变量。

例子,

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.

也就是说,静态初始化通常涉及常量表达式(在编译时已知),而动态初始化涉及非常量表达式。

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


由于d 是一个全局变量,它具有静态存储。这意味着,根据§3.6.2.1,它在静态初始化阶段被初始化为0,该阶段发生在任何其他初始化发生之前。然后,在运行时,它使用从函数factorial() 返回的值动态初始化。

这意味着,全局对象可以被初始化两次:一次是静态初始化(即零初始化),然后是在运行时动态初始化。

【讨论】:

谢谢nawaz。但我有点困惑,你能用一个小程序来做吗。 @Mahi 在动态初始化中,您在运行时计算变量的值。在静态初始化中,您在编译时设置它。在上面的例子中,假设 int f() 返回一个随机的“int”,那么 b 的值只在运行时知道,因此是动态初始化的。 @Nawaz:请注意,有一个关于超级编译的想法,其目标是在“后期”编译阶段(实际上,可能在链接阶段)运行纯函数,以获得更快的二进制文件.我不知道 C++ 中的任何内容(纯度没有注释...),但 Haskell 已经进行了各种尝试。 @Mahi:“谢谢 Nawaz。我现在清楚了。”最好表示为对您帮助最大的答案旁边的绿色勾号。见FAQ @DeadMG:代码有多好,这不是重点。它不是用于生产的代码。但是这里有些人疯了。他们想要一个生产代码作为“示例”代码,甚至没有意识到 示例 代码用于演示 其他 概念。【参考方案2】:

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

#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;

 

我们知道一个常量只能获得一次值,即在初始化时。 这个例子表明,即使是静态存储的全局变量,如果通过函数的返回值动态初始化,分配给变量的第一个值是函数返回的值,它替换了分配的变量的初始默认值 0内存分配的时间。

【讨论】:

【参考方案3】:

在运行时从键盘初始化变量称为动态初始化。

程序代码:-

 int a=cube(n);

在上面的程序代码中,a是一个全局变量,通过函数cube动态分配了一个数字n,其中cube()执行一个数字的立方。

这是一个动态初始化的例子。

【讨论】:

【参考方案4】:

动态初始化意味着可以在运行时提供初始值。甚至类对象也可以动态初始化。 IE。使用运行时提供的值。 :-))

【讨论】:

以上是关于什么是 C++ 中对象的动态初始化?的主要内容,如果未能解决你的问题,请参考以下文章

智能指针

C++ 中vector的重要特点——对象动态增长

如何初始化动态对象数组

C++中类对象数组的初始化

C++中初始化: vector<int> nums(4,(1,4)); 这是啥方式的初始化?

C++对象模型