tuc*_*uxi 2 c++ struct initialization
我想知道在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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:在粗体部分删除了"或者我应该只使用构造函数"; 因为让我问的是,我想知道它是否是有保证的行为 - 我们都同意可读代码对于显式构造函数更好.
动态分配不是对您的struct成员进行零初始化; 这是你的语法:
X* ptr = new X();
// ^^
//
// as opposed to just:
X* ptr = new X;
Run Code Online (Sandbox Code Playgroud)
如果你想保证,那就继续写下来吧.:)
与自动存储持续时间等效的网格很好的替代方法是使用更新的{}语法:
X* ptr = new X{}; // dynamic
X obj{}; // automatic
Run Code Online (Sandbox Code Playgroud)
具有静态存储持续时间的对象无论如何都始终为零初始化,因此默认情况下您将被覆盖.