gpt4 book ai didi

C++ 类变量和默认构造

转载 作者:行者123 更新时间:2023-11-28 00:40:23 27 4
gpt4 key购买 nike

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 需要有默认构造函数?

最佳答案

这样做的原因是您没有初始化 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) {}

关于C++ 类变量和默认构造,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19212903/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com