使用具有自动存储持续时间的内置类型的未初始化对象是未定义的行为.当然,我强烈建议总是在类类型中初始化内置类型的成员变量.尽管如此,我假设如果类类型的相应对象具有静态存储持续时间(即全局对象),则没有初始化器的内置类型的成员总是初始化为零.我的假设是,具有静态存储持续时间的类类型对象的完整内存被清零.
例:
#include <iostream>
using namespace std;
class Foo {
public:
int bar;
};
Foo a;
int main() {
Foo b;
cout << "a.bar " << a.bar << "\n";
cout << "b.bar " << b.bar << "\n";
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译:
$ g++ -o init init.cpp -Wall -pedantic # gcc 7.2.1
init.cpp: In function ‘int main()’:
init.cpp:14:31: warning: ‘b.Foo::bar’ may be used uninitialized in this function [-Wmaybe-uninitialized]
cout << "b.bar " << b.bar << "\n";
^~~~
Run Code Online (Sandbox Code Playgroud)
GCC仅抱怨具有自动存储持续时间b.bar而不是a.bar的类类型对象的成员.所以我是对的?
请随时修改此问题的标题.
谢谢
正如评论中所述,它是零初始化的,[basic.start.init]/3:
具有静态存储持续时间([basic.stc.static])或线程存储持续时间([basic.stc.thread])的变量应在任何其他初始化发生之前进行零初始化([dcl.init])。[... ]
零初始化一个对象,零初始化它的所有非静态数据成员和填充位,[dlc.init]/6.2:
对T 类型的对象或引用进行零初始化意味着:[...]
- 如果 T 是(可能是 cv 限定的)非联合类类型,则每个非静态数据成员和每个基类子对象均初始化为零,并且填充初始化为零位;[...]
因此,正如您所说,整个对象内存被清零(属于其值表示及其填充位的位)。