【发布时间】:2014-08-13 04:27:55
【问题描述】:
让我们有一个类的对象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 表达式初始化 对象如下:
——如果省略了 new-initializer,则对象为 默认初始化(8.5);如果不执行初始化,则 对象具有不确定的价值。
——否则,新的初始化器是 根据 8.5 的初始化规则解释 直接初始化。
在特定情况下,对象o 会执行默认初始化(即构造函数调用)。但是他的子对象呢?似乎也执行了默认初始化。但是在标准中哪里规定了如果任何子对象的完整对象被默认初始化,则对它们执行默认初始化?
【问题讨论】:
-
o的声明是一种立即泄漏内存的好方法。无论如何,你想要 [class.base.init]。
标签: c++ initialization