【发布时间】:2015-05-06 13:05:21
【问题描述】:
我想知道在 C++ 中将没有默认构造函数的结构(或类)清零的规则。
特别是,如果存储在堆栈中(例如,作为局部变量),它们似乎是未初始化的,但如果在堆上分配,它们是零初始化的(使用 GCC 4.9.1 测试)。 是否保证便携?
示例程序:
#include <iostream>
#include <map>
using namespace std;
struct X {
int i, j, k;
void show() { cout << i << " " << j << " " << k << endl; }
};
int fib(int i) {
return (i > 1) ? fib(i-1) + fib(i-2) : 1;
}
int main() {
map<int, X> m;
fib(10); // fills the stack with cruft
X x1; // local
X &x2 = m[1]; // heap-allocated within map
X *x3 = new X(); // explicitly heap-allocated
x1.show(); // --> outputs whatever was on the heap in those positions
x2.show(); // --> outputs 0 0 0
x3->show(); // --> outputs 0 0 0
return 0;
}
已编辑:删除了粗体部分中的“或者我应该只使用构造函数”;因为让我问的是我想知道它是否是有保证的行为 - 我们都同意使用显式构造函数的可读代码更好。
【问题讨论】:
-
我没有足够的知识来发布一个充实的答案,但
new X()将初始化X,而new X不会(在本例中X是聚合) -
您应该始终编写构造函数并设置类的内部变量。不管编译器是否已经设置了它们。
-
@Quentin 这两个语句是一样的,但是应该首选第二个(
new X) -
@maja 他们不一样,我更喜欢
new X()。为什么更喜欢new X?
标签: c++ struct initialization