c++ - 为什么 C++ 原始类型不像其他类型那样被初始化?

标签 c++ constructor primitive raii

我知道,在 C++ 中,当您编写时

int i;

在有效地为变量赋值之前,您不能对变量将持有的值做出任何假设。但是,如果你写

int i = int();

那么您可以保证i 将为0。所以我的问题是,这实际上不是语言行为的不一致吗?我的意思是,如果我定义了一个类 MyClass 并编写了

MyClass myInstance;

我可以放心,类的无参默认构造函数会被调用来初始化myInstance(如果没有则编译器会失败),因为RAII原则就是这样。但是,对于原始类型,资源获取似乎不再是初始化。这是为什么?

我不认为更改从 C 继承的这种行为会破坏任何现有代码(世界上是否有任何代码在假设不能对变量的值做出假设的情况下工作?),所以我想到的主要原因可能是性能,例如在创建原始类型的大数组时;不过,我还是想知道是否有一些官方对此的解释。

谢谢。

最佳答案

没有。这不是不一致。

如果你的类定义为:

struct MyClass
{
    int x;
    float y;
    char *z;
};

那么这条线并没有像你认为的那样:

MyClass myInstance; 

假设上面是在一个函数内声明的,它等同于:

int x; //assuming declared inside a function

在 C++ 中,类型大致分为 3 种,即。 POD、非 POD、聚合——它们之间有明显的区别。请阅读它们及其初始化规则(关于它们的主题太多。在本站搜索)。另请阅读 static initialization and dynamic initialization .

关于c++ - 为什么 C++ 原始类型不像其他类型那样被初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23263798/

相关文章:

c++ - 通过重载新运算符查找 MFC C++ 应用程序中的内存泄漏

javascript - 根据特定条件创建对象

c# - Java 比特转换器

java - Java 中 native 类型(基元)的泛型(或替代方法)

c++ - 重新创建交换链与在调整大小时使用动态状态

c++ - 使用 PCL 的 BreadthFirstIterator 时出现 LNK2001 错误

java - 为什么要重命名构造函数中的参数?

c++ - 您可以在类和构造函数中初始化吗?这是正确的吗?

java - 使用泛型进行选择排序

c++ - Qt OpenGL DrawElements 不绘制第二个三角形