什么是 c++ 中对象的动态初始化
What is dynamic initialization of object in c++?
什么是 c++ 中对象的动态初始化?
请用一个简单的例子来解释...
动态初始化是在编译时不知道初始化值的初始化值。它在运行时计算以初始化变量。
例
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()
返回的值进行动态初始化。
这意味着,全局对象可以初始化两次:一次通过静态初始化(即零初始化),后来在运行时,它们可以动态初始化。
动态初始化意味着在编译时不知道内存分配后分配给变量的第一个值,它仅在运行时进行评估。例如
#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。
在运行时从键盘初始化变量称为动态初始化。
程序代码:-
int a=cube(n);
在上面的程序代码中,a
是一个全局变量,一个数n
通过函数cube
动态地赋值给它,其中cube()
执行一个数的立方体。
这是动态初始化的一个示例。
动态初始化意味着可以在运行时提供初始值。甚至类对象也可以动态初始化。即使用运行时提供的值。 :-))
- 动态初始化 C 与 C++ 中的静态值
- 虚拟成员函数的定义是否强制在同一转换单元中动态初始化静态数据成员?
- 使用 constexpr 和 std::array 进行静态初始化来替换动态初始化的 std::vector 的闰年
- 如何在程序中动态初始化对象
- 3D阵列C 的动态初始化
- 无法解决动态初始化 2D 数组的问题
- 保证非 odr 使用的全局变量的延迟动态初始化
- 静态变量的 Constexpr 构造函数会导致动态初始化
- 使用构造函数动态初始化对象与 c++ 中的新函数
- 在某些情况下,如何理解允许实现将非局部变量的动态初始化视为静态初始化
- 指针阵列的动态初始化
- 给定内存地址的内存动态初始化
- 无法动态初始化类中的数组,除非大小 var 在类之外
- 动态初始化
- 抽象类实例的动态初始化
- 静态 const 数组在 MSVC 中动态初始化
- C++编译器在 main 之后实现动态初始化
- 模板结构内枚举类的动态初始化
- 动态初始化的 2D 数组输出错误
- 当静态或动态初始化时