在网站上没有发现这个问题。所以说我有两个类,一个持有对另一个的引用:
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,并且编译器没有抛出任何警告。该程序似乎工作正常。我只是想检查一下,我不指望一些不可靠的行为会导致崩溃或奇怪的错误。
答案 0 :(得分:4)
类成员按其声明顺序初始化,因此您的代码定义明确并按照您的想法进行。
(如果构造函数初始化列表的顺序与声明的顺序不同,一个好的编译器应该警告你,因为这确实是一个微妙的错误来源。但是你的代码正确地做了。)