c++ - 初始化顺序问题

标签 c++ initialization initialization-order

给定代码示例:

class B {
    //Some contents.
};

class C {
    private:
        B& b;
};

class A {
    private:
        B b;
        C c;
};

C类有一个b的引用,所以需要用它来初始化。类 A 包含 B 的实例和 C 的实例。

我的问题是:我可以用 A 中的 B 实例初始化 A 中的 C 实例吗(假设我不厌其烦地将构造函数放入其中)?其次,我是否需要对 A 中的 B 执行任何显式初始化,还是因为它是类中的类类型而默认初始化?

最佳答案

成员变量按照它们在类声明中声明的顺序进行初始化(即使它们在构造函数的初始化列表中的顺序不同),所以是的,到时候c正在初始化,b将被初始化,您可以使用b来初始化c

正如 Ricardo Cardenes 指出的那样,即使您在类定义中的 b 之前声明了 c(这意味着您将传递 C::C 对未初始化的 B 的引用)但是,如果您使用 C::C 中的对象,则会导致未定义的行为。首先声明 b 更安全,因为虽然您现在可能不会在 C::C 中使用 b,但您将来可能会忘记它引用指向未初始化的 B,并导致 UB。

不,您不必显式初始化 b (除非它是 POD ),除非您不希望它是默认构造的。所以这段代码就是你想要的(同样,如果 B 不是 POD):

A::A() : c(b) { }

关于c++ - 初始化顺序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8808883/

相关文章:

c++ - 在初始化中使用新声明的变量 (int x = x+1)?

c++ - 从全局对象的构造函数调用时的 std::atexit 排序

c++ - 构造函数初始化列表中的循环依赖

c++ - 为什么 unsigned char 具有与其他数据类型不同的默认初始化行为?

C++ 标准 : why are some "orders" defined and some not?

c++ - 类层次结构中的静态初始化顺序

c++ - 提升 lambda 困惑

c++ - 为什么 B::f 被 B 的临时对象调用时 void B::f() const & 被选中?

c++ - 将 QString 转换为 const char* 时不可预测的运行时行为

c++ - 如何初始化一个大小最初未知的数组?