我不太明白,按照http://en.cppreference.com/w/cpp/language/zero_initialization的规定,什么情况下我的类中的成员被初始化为零。
请看下面这个测试程序:
#include <iostream>
#include <stdio.h>
class MyTest {
private:
const static unsigned int dimension = 8;
void (* myFunctions [dimension])();
public:
MyTest() {}
void print() {
for(unsigned int i=0; i < MyTest::dimension; i++) {
printf("myFunctions[%d] = %p\n", i, this->myFunctions[i]);
}
}
};
int main() {
//We declare and initialize an object on the stack
MyTest testObj = {};
testObj.print();
return 0;
}
我声明一个类具有一个由8个函数指针组成的数组,其签名为“void functionname()”。当我在main
中声明并初始化一个类对象,如MyTest testObj = {};
或MyTest testObj;
时,我期望它被零初始化,即所有指针都是空指针。
然而,在我的Windows 10机器上使用g++ 5.3.0编译,命令为g++ -m32 -o test -std=c++14 test.cpp && test
, 输出结果为:
myFunctions[0] = 76dd6b7d
myFunctions[1] = 00401950
myFunctions[2] = 0061ff94
myFunctions[3] = 004019ab
myFunctions[4] = 00401950
myFunctions[5] = 00000000
myFunctions[6] = 003cf000
myFunctions[7] = 00400080
看起来像是从堆栈中未初始化的值...
如果我将对象的声明移到main函数外面(作为全局变量),它会再次打印所有的零。 如果我正确理解了cppreference,这是因为我有一个具有静态存储期限的变量,因此它被零初始化。 它通过零初始化我的类类型来初始化所有非静态数据成员(即myFunctions
数组)。 数组通过零初始化它的每个元素,对于我的函数指针情况,它是一个空指针。
为什么当我用MyTest testObj = {};
声明时它不会在堆栈上将我的对象初始化为零?
MyTest() {}
构造函数不会初始化任何东西。 - Eljay6.6.2 静态初始化
具有静态存储期的对象将被零初始化。这就是为什么当你将它作为全局变量时,所有内容都会被初始化为零。自动对象遵循稍微复杂一些的规则。 - Martin York