假设我们有一个对象 o,它是某个类型的类,并包含另外两个类类型的成员子对象 so 和 sso。请考虑以下示例:
#include <iostream>
using namespace std;
struct SO{ SO(){ cout << "SO()" << endl; } };
struct SSO{ SSO(){ cout << "SSO()" << endl; } };
struct O
{
O(){ cout << "O()" << endl; }
SO so;
SSO sso;
};
int main()
{
O o = *(new O);
}
输出:
SO()
SSO()
O()
如 5.3.4 部分 所述:
创建 T 类型对象的 new-expression 初始化该对象如下:
— 如果省略 new-initializer,则对象进行默认初始化 (8.5); 如果未执行任何初始化,对象的值是不确定的。
— 否则,new-initializer 根据 8.5 中直接初始化的初始化规则进行解释。
在这种情况下,对象 o
进行默认初始化(即构造函数调用)。但它的子对象呢?似乎也进行了默认初始化。但是标准中哪里指定默认初始化适用于任何子对象,如果它们的完整对象被默认初始化?
o
的声明是立即泄漏内存的好方法。无论如何,你需要[class.base.init]。 - chris