我想为矢量重新定义[]
运算符。我认为实现这一目标的最简单方法是创建我自己的类,比如说这样(这是简化的示例):
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
,我可以存储对它的引用,但据我所知,我不能在类中使用未初始化的引用。尽管如此,也许有一些解决方法可以在不复制数据的情况下工作吗?
答案 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]; }
};
请注意,如果您在构造函数中使用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 的引用。