2

来自Java,我对下面的代码有困难。在我的理解 b 只是在第 3 行声明但没有实例化。

在 A 类中创建 B 实例的教科书方法是什么?

class A {
  private:
    B b;
  public:
    A() { 
      //instantiate b here?
    }
};

编辑:如果 B 没有默认构造函数怎么办?

4

4 回答 4

9

例如,您可以bA构造函数的初始化列表中显式初始化

class A {
  B b; // private
 public:
  A : b() {} // the compiler provides the equivalent of this if you don't
}; 

但是,b无论如何都会自动实例化。B如果您需要使用非默认构造函数构建 a ,或者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.
  }
};
于 2012-07-24T13:04:11.163 回答
0

您已经在第 3 行创建了一个实例b 。这一行足以调用 B 的构造函数。如果你有这样的代码

class A {
  private:
    B *b;
  public:
    A() { 
      //instantiate b here?
    }
};

那么bA's构造函数中实例化就像

A()
 { 
    b = new B();
 }
于 2012-07-24T13:05:20.573 回答
0

您正在寻找的正确阶段是“C++ 初始化列表”。在调用构造函数之前调用/初始化此初始化列表

在默认构造函数的情况下,编译器等效构造函数将是A() : B() {}

一个很好的参考 http://www.cprogramming.com/tutorial/initialization-lists-c++.html

于 2012-07-24T13:22:16.977 回答
0

在第 3 行,它只是 B 的声明。但是在您的代码中的某处,您有:

A a;

或者

A a();

这调用了 A 的构造函数。内部 b 私有成员已满或垃圾,如未初始化。您是正确的,因为您可以并且可能应该在可能的情况下在构造期间初始化成员变量。有两种方法可以做到这一点:

A () 
{
   b = B ();
}

就像你所说:

或者

A () : b (B())
{
}

第二个版本(初始化列表)稍微高效一些,因为它直接在 b 内部创建新的 B 对象。而第一个版本创建一个临时的,然后将其移动到 b。无论如何,当您从传入的参数初始化成员时就是这种情况(对于非内置类型)。在这种情况下,我假设它是相同的,但有人将能够澄清。

于 2012-07-24T13:22:22.667 回答