在类中存储引用

时间:2017-02-09 09:14:51

标签: c++ reference initialization

我想为矢量重新定义[]运算符。我认为实现这一目标的最简单方法是创建我自己的类,比如说这样(这是简化的示例):

class MyVec
{
private:
  std::vector<double> x; // I don't need a copy in here, it could be a reference
public:
  MyVec(const std::vector<double>& y) { x = y; }
  double operator[](int i) { return x[i-1]; }
};

现在问题是我基本上不需要将数据复制到x,我可以存储对它的引用,但据我所知,我不能在类中使用未初始化的引用。尽管如此,也许有一些解决方法可以在不复制数据的情况下工作吗?

2 个答案:

答案 0 :(得分:3)

  

类构造不允许这个

确实如此,你只需要使用member initializer list。使用它是从构造函数初始化class成员的推荐方法 - 您不应该使用构造函数体。

class MyVec
{
private:
  const std::vector<double>& x; 
public:
  MyVec(const std::vector<double>& y) : x{y} { }
  double operator[](int i) { return x[i-1]; }
};

wandbox example

请注意,如果您在构造函数中使用const&,则需要存储const&,否则会丢失传递的构造函数的 const - ness 参数。

答案 1 :(得分:2)

对于像x这样的构造函数的实现,成员y将默认构造,然后由构造函数体中的class MyVec { private: const std::vector<double>& x; // it's a reference (to const) public: MyVec(const std::vector<double>& y) : x(y) {} double operator[](int i) { return x[i-1]; } }; 赋值。但参考成员不能默认构建。

因此,如果您将该成员声明为引用,则必须按member initializer list初始化它们:

  

对于无法进行默认初始化的成员,例如引用成员和const限定类型,必须指定成员初始值设定项。

e.g。

$database->query('SELECT * FROM users')

请注意,对于这种情况,必须将成员声明为对 const 的引用,因为构造函数的参数类型是对 const 的引用。