"A()" vs. "A() = default;" vs. 隐式 A()?
"A()" vs. "A() = default;" vs. Implicit A()?
#include <vector>
// version 1
struct A
{
std::vector<int> m_coll;
// The compiler will generate a ctor A() here
};
// version 2
struct A
{
std::vector<int> m_coll;
A(){}
};
// version 3
struct A
{
std::vector<int> m_coll;
A() : m_coll(){}
};
// version 4
struct A
{
std::vector<int> m_coll;
A() = default;
};
四个版本有什么区别?
m_coll
是否保证在所有这些版本中默认初始化?
每当添加额外的基准面时,都更容易考虑各种选项。 考虑:
struct A {
int i;
std::vector<int> coll;
};
在这种情况下,编译器会为您生成默认的 c'tor,但i
未初始化,因此您必须显式设置它。
让我们改进一下:
struct B {
int i {};
std::vector<int> coll;
};
对于B
,编译器也会为你生成一个默认的 c'tor,但i
是在类中初始化的,因此一个默认构造的 B
类型的对象是完全初始化的。 现在假设我想添加一个用户定义的 c'tor:
struct C {
int i {};
std::vector<int> coll;
C(int const j) : i{j} {}
};
添加用户定义的 c'tor 会禁止自动生成默认构造函数。 因此,要启用默认的c'tor,可以做一些不同的事情:
struct D1 {
int i {};
std::vector<int> coll;
D1(int const j) : i{j} {}
D1(){}
};
虽然以上内容格式良好,但我觉得它很丑。 这里D1(){}
是默认的 c'tor,i
被适当初始化,因为它有一个类内初始值设定项。 但是,执行以下操作更具描述性:
struct D2 {
int i {};
std::vector<int> coll;
D2(int const j) : i{j} {}
D2() = default;
};
这样,您可以读到您正在启用默认的 c'tor。
根据我的经验,每当需要为复制/移动构造函数和赋值运算符启用默认定义以及为虚拟析构函数启用默认定义时,使用 default
会更有帮助。
长话短说:每当需要启用编译器将禁止的 c'tor 或赋值运算符时,或者需要虚拟析构函数的默认定义时,请使用 default
。
相关文章:
- 防止主数据类型C++的隐式转换
- 模板参数替换失败,并且未完成隐式转换
- 复制列表初始化的隐式转换的等级是多少
- 生成文件不对文件使用隐式规则
- 不能将复制初始化与隐式转换的多个步骤一起使用
- 返回值优化:显式移动还是隐式
- 隐式常量/非常量运算符布尔
- 逐位操作的隐式类型转换
- 返回时不允许隐式转换
- 尝试使用算术运算符阻止隐式转换
- 获取隐式转换溢出从无符号到已签名的警告
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 我是否需要包含隐式使用/与 WindowsAPI 通信"Windows.h"?
- C++ G++ 编译器 - 错误:隐式声明的定义
- 使用 avr-gcc 隐式转换为浮点数:uint8_t vs. uint16_t
- VS 2017 不会隐式将常量字符* 转换为字符*
- 什么时候加载dll:隐式链接VS显式链接
- 隐式转换VS显式转换
- 显式赋值vs隐式赋值
- "A()" vs. "A() = default;" vs. 隐式 A()?