在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
};
答案 0 :(得分:7)
不需要显式默认初始化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};
答案 1 :(得分:1)
我的建议是这样做:
class Z{
std::vector<int> a;
int b = 0;
};
这是最短版本,也是最容易阅读的版本。它不会添加任何无用的混乱,并且很明显你是默认构造函数a
并将b
初始化为0
。