指向成员变量的指针何时生效

When does a pointer to a member variable become valid?

本文关键字:指针 何时生 变量 成员      更新时间:2023-10-16

假设我有以下类结构:

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;
};

在初始化a之前,我调用构造函数以B C的成员变量a的地址。因此,在我初始化B::*_a之前,对a的任何访问都是未定义的。但是,在初始化a之前甚至将B::_a设置为&a也是未定义的行为吗?即,C::a的内存是在调用构造函数时立即分配的,还是仅在调用构造函数的a(5)指令时分配的?

指针本身在构造函数的开头生效。您可以获取它,并存储以备将来参考。您的代码是完全有效的。

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