我可以使用其他类成员初始化初始化列表中的对象吗?

时间:2013-10-05 19:50:49

标签: c++ class reference initialization

在网站上没有发现这个问题。所以说我有两个类,一个持有对另一个的引用:

class ClassA {};

class ClassB
{
    classA & r_classA;
    public:
        ClassB( ClassA & io_classA ):r_classA( io_classA ){}
};

所以,如果我想创建一个ClassB实例,我必须在构造函数中传递一个对classA的引用:

int main()
{
    ClassA classA;
    ClassB classB ( classA );
    return 0;
}

现在说我创建了一个包含这两个类的ClassC:

class ClassC
{
    ClassA m_classA;
    ClassB m_classB;
    public:
        ClassC();
}

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

ClassC::ClassC()
: m_classA()
, m_classB( m_classA )
{}

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

1 个答案:

答案 0 :(得分:4)

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

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