3

给定代码示例:

class B {
    //Some contents.
};

class C {
    private:
        B& b;
};

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

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

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

4

4 回答 4

6

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

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

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

A::A() : c(b) { }
于 2012-01-10T19:03:06.090 回答
3

对于您的第一个问题:您可以通过编写如下构造函数来初始化它:

C::C(B& bInst): b(bInst){}
A::A():b(), c(b) {}

当然,如果您的构造函数C实际使用b(而不仅仅是它的地址),您需要确保初始化顺序保持不变,因此b必须在之前声明c,因为成员按照声明它们的顺序进行初始化(即使初始化列表以不同的顺序排列它们)。

不,您不需要显式初始化 B,因为如果您不这样做,它将是默认构造的。当然,如果 B 是 POD,这意味着保持它未初始化(同时b()在初始化列表中显式初始化它A()会将其初始化为0)。

于 2012-01-10T19:03:11.357 回答
0

是的,因为 C 只包含对 B 的引用而不是单独的实例,所以您可以在 C 中放置一个构造函数并让 ACb 引用 AB

当您创建 A 的实例时,A 中的 B 和 C 都会自动实例化/构造。

于 2012-01-10T19:02:35.217 回答
0

我可以用 A 中的 B 实例初始化 A 中的 C 实例吗(假设我确实费心将构造函数放入)

当然。

其次,我是否需要对 A 中的 B 执行任何显式初始化,还是默认初始化,因为它是类中的类类型?

不,没关系。

于 2012-01-10T19:04:22.727 回答