c++ - 指向尚未初始化的成员

标签 c++ pointers inheritance member

我问过this问题。我现在的问题是如何这是有效的?详细说明一下,我如何指向一个尚未初始化的对象。我制作了这个 MWE,它表明该对象是复制创建的,而不是复制分配的。即该对象尚未初始化,但我可以指向它。

#include <iostream>

class Foo {
public:
    int x;

    Foo(const Foo& ori_foo) {
        std::cout << "constructor" << std::endl;
        x = ori_foo.x;
    }

    Foo& operator = (const Foo& ori_foo) {
        std::cout << "operator =" << std::endl;
        x = ori_foo.x;
        return *this;
    }

    Foo(int new_x) {
        x = new_x;
    }
};

class BarParent {
public:
    Foo *p_foo;

    BarParent(Foo* new_p_foo) : p_foo(new_p_foo)
    {
       std::cout << (*new_p_foo).x << std::endl;
    }
};

class BarChild : public BarParent {
public:
    Foo foo;

    BarChild(Foo new_foo)
        :BarParent(&foo) //pointer to member not yet initialised
        ,foo(new_foo) // order of initilization POINT OF INTEREST
        {}
};

int main()  {
    Foo foo(101);

    BarChild bar(foo);

    std::cout << bar.p_foo->x << std::endl;
std::cout << bar.foo.x << std::endl;
}

输出:

constructor
0
constructor
101
101

不要害怕深入了解如何处理内存的细节。以及每个成员所在的位置。

最佳答案

不要将初始化误认为是分配。 BarChild::foo 将在调用构造函数之前分配,因为它存储在适当的位置,因此 BarParent::p_foo 将有一个明确定义的位置指向。 Foo 的构造函数将初始化 BarChild::foo,但只要您在调用构造函数之前不尝试从 BarChild::foo 读取数据,您就不会注意到顺序。

关于c++ - 指向尚未初始化的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15511995/

相关文章:

c++:从静态库创建共享对象

c++ - 释放 LPDIRECT3D9 和 LPDIRECT3DDEVICE9 后的内存状态

Java泛型参数和继承

c++ - 这是旧的 C++ 风格构造函数吗?

c++ - R6010-当 boost 文件系统的重命名或 copy_file 方法被命中时,中止被命中

c - 此示例导致c4028警告,为什么?

c - 指向结构体数组的指针增量失败

循环中的 C 后/前递增指针

c++ - 我可以使用多态性将不同的对象存储在 C++ 的数组中吗?

javascript - 为什么要使用 Object.create?