gpt4 book ai didi

c++ - 初始化类成员 - 默认值或成员初始化列表?

转载 作者:搜寻专家 更新时间:2023-10-31 02:03:15 27 4
gpt4 key购买 nike

我对何时以及如何在构造函数中初始化类的成员感到有点困惑。如果我理解正确,您可以通过在类定义中包含默认值、构造函数成员初始化列表或通过构造函数主体中的赋值来完成此操作。我意识到最好在进入构造函数主体之前进行初始化,但是什么时候应该使用成员初始化列表,什么时候应该使用默认值?

如果我从根本上误解了这里的某些内容,我深表歉意。

最佳答案

你真的有点让人困惑。至少有4个不同的概念

你做了 3 个。

在以下示例中 ( at ideone.com ) 我使用 struct 而不是 class 并为简洁/简单地使用内联构造函数。

#include <iostream>

struct A
{
A(int v=1): m(v) {}
int m;
};

struct B
{
B(): m(2) {}
int m;
};

struct C
{
C()
{
m = 3;
}
int m;
};

// since C++11
struct D
{
int m = 11;
};

int main()
{
using namespace std;
#define TRACE(arg) cout << #arg ": " << arg.m << endl;
A a1;
TRACE(a1)
A a2(4);
TRACE(a2)
B b;
TRACE(b)
b.m = 5;
TRACE(b)
C c;
TRACE(c)
c.m = 6;
TRACE(c)
D d;
TRACE(d)
d.m = 0;
TRACE(d)
#undef TRACE
}

A的用法与BCD的用法不同。

只有 A 提供了一种使用非默认值初始化 m 的方法。所有变体都提供对 m 的直接访问(大多数情况下这不是一个好的选择,将其视为修改成员的更复杂方法的占位符)。如果无法访问实际的初始化值,您必须修改一个对象。这使得 BCDconstant 对象的 m 有效地编译-时间常数。如果可以使用初始化列表(AB),则应避免构造函数体 (C) 中的成员“初始化”(有时这并不像这里显示的那么微不足道。

如果您使用的是 C++11 或更高版本,则应估计选项 D

所以 A 似乎是最灵活的选择。但这不是初始化两个或更多成员的好模式:混淆参数顺序太容易了。


[1] 这个选项是在我(感谢 NikosC )意识到这个选项存在之后添加的

关于c++ - 初始化类成员 - 默认值或成员初始化列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55777933/

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