c++ - 在初始化期间将成员地址发送给父类安全吗?

标签 c++

我需要一个父类来指向子类的结构成员。是否可以在初始化期间解决此问题,如下所示,或者 _foo 的地址是否不可用/无效?

struct Foo { int a; int b; }

class A {
public:
    A(void* fooHandle) : _fooHandle(fooHandle) {}

private:
    void* _fooHandle;
};

class B : public A {
public:
    B() : A(&_foo) {
        /* _foo initialized here */
    }
private:
    Foo _foo;
};

这段代码安全吗? IE。 &_foo 会给出有效地址吗?当然我的意思是根据标准,而不是它是否适用于某些编译器。

最佳答案

是的,这是绝对安全的。

编辑(解释):对象的存储是在调用任何构造函数之前分配的。对象占用一个存储区域,该区域具有一个起始地址和一个结束地址。中间可能有间隙(填充)。然而,在一个对象的整个生命周期中,它的所有成员都还活着。当(最终)调用构造函数时,调用其构造函数的类的所有成员对象部分已经存在(我所说的构造函数是指 {…} 之间的部分)。这就是为什么,如果你需要在构造函数执行之前进行初始化,你必须提供初始化器。成员按照它在类中出现的顺序进行初始化,如果初始化器以不同的顺序出现,您将收到严重警告,因此只要您将地址传递给成员,并完成初始化,您在这些成员的生命周期内。

以同样的方式,只有在调用所有析构函数后,成员的生命周期才会结束。

当然是用 new 创建的任何东西并用 delete 销毁具有与类实例生命周期无关的生命周期,因此您必须小心。

但是我想知道它的实际应用是什么。此外,我建议使用引用而不是指针来强制传递有效对象并使构造函数受到保护,以便它只能从子类中使用。

关于c++ - 在初始化期间将成员地址发送给父类安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49513570/

相关文章:

c++ - 窗口 api 大小和移动控制台

c++ - 当字符串末尾被修改时,delete[] 的行为是什么

c++ - Android NDK 要求在源文件中包含绝对路径

java - OCR 库可识别仪表设备上的数字

c++ - 如何获得由 gcc-mingw 编译的进程的最大内存使用量

c++ - 如何将一个自创建的类包含在另一个自创建的类的头文件中?

c++ - multimap<vector<int>> ,char> 怎么排序呢?

c++ - 在新选项卡中打开 URL (Internet Explorer)

c++ - x86 或 x64 上的散列之间的区别

c++ - 动态 3d 数组的声明和分配