让我们有一个类的对象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的对象的新表达式将该对象初始化如下: -如果省略新的初始化器,则该对象为默认初始化(8.5);如果不执行初始化,则该对象具有不确定的值。 -否则,将根据8.5的初始化规则解释新的初始化程序,以进行直接初始化.
在特定情况下,对对象o执行默认初始化(即构造函数调用)。但他的小玩意呢?似乎也会执行默认初始化。但是,如果任何子对象的完整对象都是默认初始化的,那么在标准中指定在哪里执行默认初始化呢?
发布于 2014-08-13 04:33:51
如果说为对象o执行默认初始化是不正确的。在示例对象中,o是复制初始化的。您的示例中的默认初始化是为new创建的未命名对象执行的(该对象随后会泄漏)。
现在,由O创建的类型为new的未命名对象实际上是默认初始化的,在本例中,这意味着它是通过调用用户定义的默认构造函数O::O()来初始化的。O::O()构造函数中的构造函数初始化程序列表完全不存在,即没有提到任何子对象。这意味着这些子对象将被默认初始化。
如上文所述
12.6.2初始化基和成员()
非委托构造函数中的8,如果给定的非静态数据成员或基类不是由mem初始化程序id指定的(包括由于构造函数没有ctor初始化器而没有mem初始化程序列表的情况),且实体不是抽象类的虚拟基类(10.4),则该实体不是抽象类的虚拟基类。 -如果实体是具有大括号或等初始化器的非静态数据成员,则按8.5中指定的方式初始化该实体; -否则,如果该实体是一个变体成员(9.5),则不执行初始化; -否则,实体是默认的-初始化(8.5)。
最后一个选项适用于您的情况。(由于我使用的是文档的草稿版本,所以编号可能是关闭的。)
请注意,问题的标题提到了“次对象初始化的顺序”,而实际的问题与顺序本身无关。它是关于初始化的方法。
发布于 2014-08-13 04:40:31
12.6.2/10
在非委托构造函数中,初始化按以下顺序进行:
base-specifier-list中基类的出现顺序。因此:无论选择哪个构造函数进行初始化--默认的还是其他的,显式默认的还是用户提供的--首先初始化虚拟基类,然后初始化直接基类(按照它们出现在基类说明符-列表中的顺序,而不是按照它们在ctor-初始化器中出现的顺序);最后,非静态数据成员子对象按声明顺序初始化。
发布于 2014-08-13 04:33:33
默认情况下,8.5/6 -初始化T类型的对象意味着:
https://stackoverflow.com/questions/25278066
复制相似问题