【发布时间】:2014-06-09 10:29:38
【问题描述】:
我知道,在 C++ 中,当你编写时
int i;
在您有效地为其赋值之前,您不能对变量将持有的值做出任何假设。但是,如果你写
int i = int();
那么您可以保证i 将是0。所以我的问题是,这实际上不是语言行为的不一致吗?我的意思是,如果我定义了一个类 MyClass 并写了
MyClass myInstance;
我可以放心,将调用不带参数的类的默认构造函数来初始化myInstance(如果没有,编译器将失败),因为这就是 RAII 原则的运作方式。但是,对于原始类型,似乎资源获取不再是初始化。这是为什么呢?
我不认为更改从 C 继承的这种行为会破坏任何现有代码(世界上是否有任何代码假设不能对变量的值做出假设?),所以我想到的主要原因可能是性能,例如在创建原始类型的大数组时;但是,我想知道是否有一些官方对此的解释。
谢谢。
【问题讨论】:
-
"世界上是否有任何代码假设不能对变量的值做出假设?"是的,对于熵池。
-
我认为你从错误的角度看它。从历史上看,变量是未初始化的,所以问题应该是为什么(某些)C++ 的新类类型会改变,这个问题更容易回答。您在问为什么旧类型偏离规范,但旧类型是规范。
-
你可以试着问为什么 MyClass();不需要调用构造函数,因为它使您的视图更加一致。
-
@Étienne Touché,很酷的例子(虽然我希望他们不要依赖未初始化的变量)。
-
@user2672165 你是对的,但这只是因为编译器会将对象构造与函数声明混淆。
标签: c++ constructor primitive raii