来自Java,我对下面的代码有困难。 在我的理解中,b仅在第3行声明但未实例化。
在A类中创建B实例的教科书是什么?
class A {
private:
B b;
public:
A() {
//instantiate b here?
}
};
编辑:如果B没有默认构造函数怎么办?
答案 0 :(得分:9)
您可以在b
的构造函数初始化列表中显式初始化A
,例如
class A {
B b; // private
public:
A : b() {} // the compiler provides the equivalent of this if you don't
};
但是,b
无论如何都会自动实例化。如果您需要使用非默认构造函数构建B
,或者B
无法默认初始化,则上述内容有意义:
class A {
B b; // private
public:
A : b(someParam) {}
};
在构造函数的初始化列表中正确初始化可能是不可能的,在这种情况下,赋值可以在构造函数的主体中完成:
class A {
B b; // private
public:
A {
b = somethingComplicated...; // assigns new value to default constructed B.
}
};
答案 1 :(得分:0)
您已在第3行创建了b
的实例。此行足以调用B的构造函数。如果您有这样的代码
class A {
private:
B *b;
public:
A() {
//instantiate b here?
}
};
然后在b
构造函数中实例化A's
就像
A()
{
b = new B();
}
答案 2 :(得分:0)
您正在寻找的正确阶段是“C ++初始化列表”。在调用构造函数之前调用/初始化此初始化列表
对于Default构造函数,编译器equvalient构造函数将为A() : B() {}
非常好的参考 http://www.cprogramming.com/tutorial/initialization-lists-c++.html
答案 3 :(得分:0)
在第3行,它只是B的声明。但是在你的代码中你所拥有的地方:
A a;
或
A a();
这会调用A的构造函数。内部b私有成员是full或garbage,如未初始化。你是正确的,你可以并且可能应该在施工期间初始化成员变量。有两种方法可以做到这一点:
A ()
{
b = B ();
}
就像你说的那样:
或
A () : b (B())
{
}
第二个版本(初始化列表)稍微更高效,因为它直接在b内创建新的B对象。而第一个版本创建一个临时版本,然后将其移动到b。无论如何从传入的参数初始化成员时都是这种情况(对于非内置类型)。我在这种情况下做出了相同的假设,但有人能够澄清。