使用构造函数作为默认成员值
Using Constructor for default member value
在c++ 11中,可以不使用初始化列表来初始化对象:
class Z{
int a=0;
int b;
z():b(0){} //<-- a already initialized
};
我想知道的是,对于类类型,哪一种是更好的:
class Z{
std::vector<int>a=std::vector<int>();
//or instead:
std::vector<int>a();
int b;
z():b(0){} //<-- a already initialized
};
不需要显式默认初始化a
,因为它将默认构造。这样就可以了:
class Z
{
std::vector<int> a;
int b = 0;
z() {} //<-- a, b already initialized
};
注意你的第二个变量是一个函数声明,而不是一个初始化:
// function a(), returns std::vector<int>
std::vector<int> a();
所以你应该用
// data member a is an std::vector<int>. Default construct it.
std::vector<int> a{};
当然,如果您不想要默认构造,那么在声明点进行初始化非常方便:
std::vector<int> a{0,1,2,3};
我的建议是:
class Z{
std::vector<int> a;
int b = 0;
};
这是最短的版本,也是最容易阅读的。它不会增加任何无用的混乱,并且很明显您是默认构造函数a
,并将b
初始化为0
。
相关文章:
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 基类中的默认析构函数禁用子类中的移动构造函数(如果有成员)
- C++向量默认为成员参数
- 结构中的默认成员值或默认构造函数参数
- 构造函数可以更改默认成员类型吗?
- 在成员函数外部封闭类的定义中需要默认成员初始值设定项
- 所有版本的 GCC 都与默认成员初始值设定项作斗争,该初始值设定项捕获了这一点,并结合了继承的构造函数
- 如果有默认成员初始化,为什么要使用成员初始化列表
- “在成员函数之外封闭类的定义中需要默认成员初始值设定项” - 我的代码格式不正确
- 使用默认成员初始值设定项对 std::array 的元素进行零初始化
- C - 混合默认成员初始化器和成员初始化列表 - 坏主意
- 为什么默认成员值禁止使用支持列表初始化
- 自定义分配器和默认成员
- C++C-tor处理默认成员值构造异常
- 非静态数据成员上的成员初始值设定项列表和默认成员初始值设定项之间有什么区别?
- 为什么地址运算符是C++类的默认成员,它是什么
- C++:如何使某些类访问其对象中的默认成员?
- 如果std::make_unique从未被调用,为什么它在默认成员初始化中不需要参数
- 使用构造函数作为默认成员值
- 如何防止c++创建默认成员