jde*_*esa 10 c++ primitive constructor raii
我知道,在C++中,当你写作时
int i;
Run Code Online (Sandbox Code Playgroud)
在有效地为其赋值之前,您不能对变量将保持的值做任何假设.但是,如果你写
int i = int();
Run Code Online (Sandbox Code Playgroud)
那么你有保证i会0.所以我的问题是,它实际上并不是语言行为的一种不完整性吗?我的意思是,如果我已经定义了一个类MyClass并且写了
MyClass myInstance;
Run Code Online (Sandbox Code Playgroud)
我可以放心,没有类参数的默认构造函数将被调用以初始化myInstance(如果没有,编译器将失败),因为这就是RAII原理的方式.但是,当涉及到原始类型时,资源获取似乎不再是初始化.这是为什么?
我不认为改变从C继承的这种行为会破坏任何现有的代码(世界上是否有任何代码假设不能对变量的值做出假设?),所以主要可能的原因我想到的就是性能,例如在创建基本类型的大数组时; 但是,我还想知道是否有一些官方解释.
谢谢.
不,这不是不一致的.
如果您的课程定义为:
struct MyClass
{
int x;
float y;
char *z;
};
Run Code Online (Sandbox Code Playgroud)
那么这一行并不是你认为它做的那样:
MyClass myInstance;
Run Code Online (Sandbox Code Playgroud)
假设在函数内部声明了上述内容,它与:
int x; //assuming declared inside a function
Run Code Online (Sandbox Code Playgroud)
在C++中,类型大致分为3种即.POD,非POD,聚合 - 它们之间有明显的区别.请阅读它们及其初始化规则(关于它们的主题太多.在此站点上搜索).另请阅读静态初始化和动态初始化.
至少在最初阶段,真正的原因是C++希望所有与C兼容的对象的行为与在C中完全相同.C中的原因是(现在仍然是)性能; 具有静态生命周期的对象的零初始化是免费的(因为出于安全原因,操作系统必须初始化它为进程提供的所有内存); 零初始化否则需要运行时间 (今天的性能原理不如原来那么强,因为编译器在确定变量将在以后初始化时更好,并且在这种情况下抑制零初始化;但它们仍然存在;特别是在情况下喜欢:
char buffer[1000];
strcpy( buffer, something );
Run Code Online (Sandbox Code Playgroud)
如果需要零初始化,我不知道任何能够在这里跳过它的编译器,即使它没有必要.)