2016-07-07 71 views
2

假设我有下面的类结构:何时指向成员变量的指针变为有效?

class A 
{ 
public: 
    A(int test) : _test(test) { /* do nothing */ } 
private: 
    int _test; 
}; 

class B 
{ 
public: 
    B(A* a) : _a(a) { /* do nothing */ } 
private: 
    A* _a; 
}; 

class C : public B 
{ 
public: 
    C() : B(&a), a(5) { /* do nothing */ } 
private: 
    A a; 
}; 

我与地址C的成员变量a调用构造函数来B之前,我初始化a。因此,在我初始化a之前,对B::*_a的任何访问都将不确定。但是,在初始化a之前,甚至将B::_a设置为&a也是未定义的行为?也就是说,只要构造函数被调用,或仅在构造函数的a(5)指令被调用时,C::a才会被分配内存。

+2

只需存储指针即可。取消引用它不是,直到成员初始化。 –

回答

3

指针本身在构造函数的开始处变为有效。您可以获得它,并存储以备将来参考。你的代码完全有效。

虽然在变量初始化之前,B或A的构造函数将指针取消引用为“a”是未定义的行为。