我可以用另一个类成员初始化初始化列表中的对象吗?

Kia*_*ian 0 c++ initialization reference class

在网站上还没有发现这个问题。假设我有两个类,其中一个类包含对另一个类的引用:

class ClassA {};

class ClassB
{
    classA & r_classA;
    public:
        ClassB( ClassA & io_classA ):r_classA( io_classA ){}
};
Run Code Online (Sandbox Code Playgroud)

因此,如果我想创建 ClassB 的实例,我必须在构造函数中向它传递对 classA 的引用:

int main()
{
    ClassA classA;
    ClassB classB ( classA );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

现在假设我创建了一个 ClassC 类来保存这两个:

class ClassC
{
    ClassA m_classA;
    ClassB m_classB;
    public:
        ClassC();
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,我可以指望在初始化列表中构造 m_classB 之前创建 m_classA 吗?也就是说,我可以这样做吗:

ClassC::ClassC()
: m_classA()
, m_classB( m_classA )
{}
Run Code Online (Sandbox Code Playgroud)

这个标准符合吗?便携的?我需要采取任何特殊的预防措施吗?我已经在 ClassC 主体中的 m_classB 之前声明了 m_classA,并且编译器没有抛出任何警告。该程序似乎工作正常。我只是想检查一下我是否没有指望一些不可靠的行为会导致崩溃或奇怪的错误。

Ker*_* SB 5

类成员按照声明的顺序进行初始化,因此您的代码定义良好并且按照您的想法执行。

(如果构造函数初始值设定项列表的顺序与声明的顺序不同,一个好的编译器应该警告您,因为这确实是一个微妙的错误来源。但是您的代码正确地执行了它。)