c++ - 构造函数初始化列表顺序/分配问题

标签 c++ constructor

我的问题很简单,下一段代码安全吗?

struct Parent {
    B* _a;
    Parent(B* a) : _a(a) {}
};

struct Child : public Parent {
    B _b;
    Child() : Parent(&_b),  _b(2){};
};

int main() {
    Child c;
    return 0;
}

还有两点:

  • 我对将对成员对象的引用传递给父对象的部分很感兴趣。
  • 我所说的安全是指 _b 将被分配(及其内存地址),并且无论我使用哪种编译器,此代码都可以正常工作。

提前致谢。

澄清
我所说的安全实际上是指内存地址是有效的,因为我已经知道它没有被初始化。

其他注意事项
在我的实际代码中,我想将 B 类型的对象存储为指向其基类 A 的指针,如下所示:

struct Parent {
    A* _a;
    Parent(A* a) : _a(a) {}
};

struct Child : public Parent {
    B _b;
    Child() : Parent(&_b),  _b(2){};
};

int main() {
    Child c;
    return 0;
}

如果我理解 AndreyT 回答正确,那是非法的。我想我会尝试以不同的方式执行此操作,因为这种方法很容易出错。 (我可能会忘记我不能使用那个指针并在我的下一个重构中用它做一些事情)。

最佳答案

从您描述的意义上来说,是的,它是安全的:内存已分配,可以将该指针传递给父级。 Child::_b的内存实际上是整个Child内存的组成部分。它不需要任何明确的额外“分配”。在 Child::Child 构造函数被调用的那一刻,内存显然已经存在。

但是,指针指向的内存只能以有限的方式使用(标准在 3.8 中描述了可以做什么和不能做什么),因为它指向的对象尚未初始化。在您的具体示例中,您只需存储指针。完全没问题。

但是,例如,如果您想要将该指针转换为某个基类类型(假设 B 具有某个基类),您的代码将是非法的。将指向未初始化对象的指针转换为其基类指针是非法的(再次参见 3.8)。

关于c++ - 构造函数初始化列表顺序/分配问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4108609/

相关文章:

C++ 使用继承为对象分配空间

c++ - std::thread 构造函数如何检测右值引用?

javascript - 调用 javascript 构造函数方法

android - 如何将全局变量从一个类获取到另一个类?

c++ - 仅为C++文件生成标记文件(.h,.cpp,.cxx,.c)

c++ - 常量操作数与任何算术运算符的顺序是否会影响优化?

c++ - Qt编译报错: "out of memory allocating 134 MB" "cc1plus.exe not found"

c++ - 如何在 C++ 中为嵌套模板数字类型类编写构造函数?

java - 用于实例化内部类的奇怪语法

c++ - 选择构造函数的更好模式