声明与实例化

时间:2012-07-24 13:01:57

标签: c++ oop

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

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

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

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

4 个答案:

答案 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。无论如何从传入的参数初始化成员时都是这种情况(对于非内置类型)。我在这种情况下做出了相同的假设,但有人能够澄清。