2

在 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
   };
4

2 回答 2

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};
于 2013-05-21T12:57:39.317 回答
1

我的建议是这样做:

class Z{
   std::vector<int> a;
   int b = 0;

};

这是最短的版本,也是最容易阅读的版本。它不会添加任何无用的混乱,并且很明显您是默认构造函数a并初始化b0.

于 2013-05-21T12:59:21.140 回答