使用构造函数作为默认成员值

Using Constructor for default member value

本文关键字:默认 成员 构造函数      更新时间:2023-10-16

在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