0
class ClassB
{
    int option;

public:
    ClassB(void){} //without the default constructor, the example does not compile.
    ClassB(int option)
    {
        this->option = option;
    }
};

class ClassA
{
    ClassB objB; //initialize objB using default constructor. When does this actually occur?

public:
    ClassA(int option)
    {
        objB = ClassB(option); //initialize objB again using another constructor.
    }
};

int main(void)
{
    ClassA objA (2);

    return 0;
}

我是 c++ 新手(来自 c#),我对如何初始化类变量有点困惑。在上面的例子中,ClassA 声明了一个 ClassB 类型的类对象,按值存储。为此,ClassB 必须具有默认构造函数,这意味着 ClassA 首先使用默认构造函数创建 ClassB。但是 ClassA 从不使用这个默认的 objB,因为它会立即在 ClassA 的构造函数中被覆盖。

所以我的问题是: objB 实际上被初始化了两次吗?

如果是这样,那不是不必要的步骤吗?将 objB 声明为指针会更快吗?

如果没有,为什么 ClassB 需要有一个默认构造函数?

4

1 回答 1

3

这样做的原因是您没有初始化objB数据成员,而是在默认构造后分配给它。

ClassA(int option)
{
  // By the time you get here, objB has already been constructed
  // This requires that ClassB be default constructable.

    objB = ClassB(option); // this is an assignment, not an initialization
}

要对其进行初始化,请使用构造函数成员初始化列表:

ClassA(int option) : objB(option) {}

这使用正确的构造函数进行初始化objB,并且不需要ClassB默认可构造。请注意,这同样适用于ClassB,其构造函数应为

ClassB() : option() {} // initializes option with value 0
ClassB(int option) : option(option) {}
于 2013-10-06T19:23:55.740 回答