使用默认值初始化成员引用

时间:2018-06-12 18:18:12

标签: c++ constructor default-arguments

我有一个std::vector const&成员的类,它应该通过构造函数设置。但是,也应该可以在构造函数中省略此参数,并使用默认值初始化该成员。

示例代码:

class MyClass {
public:
  MyClass(int a, const std::vector<int> &v = {42,42,42}) : vec(v){}

  const std::vector<int> &vec;
};

int main(void) {

  std::vector<int> a{1,2,3};

  MyClass c1(1,a);              // c1.vec = 1,2,3
  MyClass c2(1);                // c2.vec = randomStuff
                                // should actually be 42,42,42
}

如果我将初始化更改为:

MyClass(int a, const std::vector<int> &v = *(new std::vector<int>{42,42,42})) : vec(v){}

一切正常,因为超出范围时不会删除临时矢量。但是,这感觉不对,看起来内存泄漏。是否有更好的方法来实现预期的行为?

1 个答案:

答案 0 :(得分:5)

您可以将默认参数定义为类的静态数据成员:

class MyClass {
 public:
  MyClass(int a, const std::vector<int> &v = defaultVec) : vec(v){}

  const std::vector<int> &vec;

 private:
  static const std::vector<int> defaultVec;
};

const std::vector<int> MyClass:defaultVec{42, 42, 42};

要保持类标头,您还可以在静态成员函数中使用静态变量:

class MyClass {
 public:
  MyClass(int a, const std::vector<int> &v = defaultVec()) : vec(v){}

  const std::vector<int> &vec;

 private:
  static const std::vector<int>& defaultVec()
  {
   static const std::vector<int> v {42, 42, 42};
   return v;
  }
};

请注意,无论哪种方式,用作默认参数的向量都必须具有静态存储持续时间,以便在构造函数完成运行后它仍然有效。