拿一个普通的结构体(或类),其中成员都是普通数据类型和对象。注意,没有定义默认构造函数。
struct Foo
{
int x;
int y;
double z;
string str;
};
现在,如果我在堆栈上声明一个实例 f 并尝试打印其内容:
{
Foo f;
std::cout << f.x << " " << f.y << " " << f.z << f.str << std::endl;
}
对于x、y和z,打印出的数据是垃圾数据。字符串被默认初始化为空。 如预期所示。
如果使用make_shared
创建一个shared_ptr<Foo>
实例并打印:
{
shared_ptr<Foo> spFoo = make_shared<Foo>();
cout << spFoo->x << " " << spFoo->y << " " << spFoo->z << spFoo->str << endl;
}
那么,x、y和z都是0
。这似乎表明,在对象实例构造之后,shared_ptr
执行了默认初始化(零初始化)于每个成员上。至少这是我用Visual Studio编译器观察到的。
对于C ++来说,这是标准的吗?还是必须在实例化后具有显式构造函数或显式 = {} 语句才能保证在所有编译器中实现零初始化行为?