C++未显式定义构造函数时,自定义类成员为何默认初始化为0/空?
关于C++类成员默认初始化的疑问
我定义了一个简单的node类,包含int类型变量x、string类型变量y以及指向同类型的指针ptr。在未对成员做任何初始化的情况下创建对象并打印成员值,发现x为0,y为空字符串,ptr为NULL。按常理它们不应是随机值吗?这是否是编译器相关的特性?
测试代码
#include<iostream> using namespace std; class node{ public: int x; string y; node* ptr; }; int main() { node* node1=new node; cout<<node1->x<<endl; cout<<node1->y<<endl; cout<<node1->ptr; return 0; }
编译器输出
0 0x0
解答
类类型成员的固定初始化:
std::string是标准库类类型,它的默认构造函数会自动把对象初始化为空字符串,这是C++标准明确规定的行为,和编译器无关。内置类型成员的特殊表现:int、指针这类内置类型,C++标准规定默认初始化的结果是未定义行为——理论上可以是任意随机值。你看到的零值(0、NULL)是当前编译器(如GCC、MSVC等)对堆上分配的对象做了零初始化优化,这属于编译器的扩展行为,并非标准强制要求,换个编译器或编译选项可能会得到不同结果。
确保初始化的标准写法:如果想要保证所有成员都被正确初始化,应该使用值初始化语法
new node(),此时内置类型会被初始化为零值,类类型会调用默认构造函数完成初始化。
内容的提问来源于stack exchange,提问作者FSI
相关产品推荐
相关产品推荐

