gpt4 book ai didi

c++ - 为什么派生类的构造函数应该在其初始化列表中使用基类的默认构造函数?

转载 作者:搜寻专家 更新时间:2023-10-31 00:10:45 25 4
gpt4 key购买 nike

这是我的问题的一个例子:

class MyBaseClass
{
public:
MyBaseClass(): my_bool(false), my_value(0)
{}
MyBaseClass(bool b, int i): my_bool(b), my_value(i)
{}

private:
bool my_bool;
int my_value;
}

class MyDerivedClass1 : public ::MyBaseClass
{
public:
MyDerivedClass1(double d): my_double(d)
{}
private:
double my_double;
}

class MyDerivedClass2 : public ::MyBaseClass
{
public:
MyDerivedClass2(double d): MyBaseClass(), my_double(d)
{}
private:
double my_double;
}

为什么 MyDerivedClass1 不是初始化派生类的好方法,而必须像 MyDerivedClass2 那样显式初始化基类?

我想我不明白为什么我不能只依赖 C++ 调用我的基本构造函数?我知道如果我想将它们初始化为不同的东西,我必须调用我的初始化列表中的其他构造函数,但我只想调用基本构造函数。

最佳答案

在初始化列表中提供或不提供默认构造的基类之间没有区别。如果完全是你的风格,你用什么。 (或公司)

一般来说,假设您始终初始化成员,我会说您有 2 个选择(让我们将构造函数放在范围之外)。

选项 1:初始化 init-list 中的所有成员。

如果您是 C++98 兼容的,则应使用此选项。它的优点是您可以在一个列表中定义所有构造参数,从而便于搜索。 (除非您有 50 多个成员)

此选项的缺点是当您有多个构造函数时会出现大量重复。

这样,您就可以为它们设置 3 个变体:

  • 跳过默认初始化的类,这会使列表更短,但很难检查您是否打算“忘记”它。 (考虑用指向它的指针替换一个类)
  • 默认初始化所有成员,这使列表更长,但清楚地表明了意图
  • 明确提供您正在初始化的类,通过临时复制构造

选项 2:在声明时初始化所有成员,构造函数参数除外

此选项假定您初始化类声明中的所有内容。同样,您可以显式调用或不调用默认构造函数,最好使用大括号 init,因为圆括号被解释为函数声明。

在初始化列表中,您只需放置链接到构造参数的成员。

此选项的优点是可读性(特别是对于大类)。缺点是这会将您的编译器选项限制为“现代”编译器。

基类

如果我们再次考虑基类并将它们视为成员,一致的方法是为选项 1 显式声明它们,而不为选项 2 编写它们。

就我个人而言,我喜欢选项 2,因为我经常遇到成员太多的类,使用这个手动检查是否所有成员都已初始化会更容易。

但是,由于遗留问题,通常会使用选项 1,以保持代码的一致性。

点播

值得一提的是 POD(普通旧数据类型),如 int、double ...如果你不初始化它们,你会得到一些随机数据。这使得显式初始化它们变得很重要,无论您使用什么方法。

结论

所以最后,这只是风格问题,没有功能差异。

关于c++ - 为什么派生类的构造函数应该在其初始化列表中使用基类的默认构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36798449/

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