我有一个我很困惑的话题,我需要详细说明一下。它是使用const版本和非const版本重载的运算符。
// non-const
double &operator[](int idx) {
if (idx < length && idx >= 0) {
return data[idx];
}
throw BoundsError();
}
我理解这个函数的一部分,取一个索引并检查它的逻辑,返回类中数组数据的索引。还有一个具有相同主体的函数,但函数调用为
const double &operator[](int idx) const
为什么我们需要两个版本?
此示例问题也可能有助于详细说明。 在下面的每个实例中使用哪个版本?
Array a(3);
a[0] = 2.0;
a[1] = 3.3;
a[2] = a[0] + a[1];
我的假设是const版本仅在a[2]
上调用,因为我们不想冒险修改a[0]
或a[1]
。
感谢您的帮助。
答案 0 :(得分:23)
当两个版本都可用时,逻辑非常简单:为const
对象调用const
版本,为非const
对象调用非const
版本。就是这样。
在您的代码示例中,a
是一个非const
对象,这意味着在所有情况下都会调用非const
版本。 const
版本从未在您的示例中调用。
拥有两个版本的目的是为非const
对象实现“读/写”访问,并仅对const
个对象实现“读取”访问。对于const
对象const
,调用operator []
版本,返回const double &
引用。您可以通过该const引用读取数据,但是您无法通过它进行写入。
答案 1 :(得分:0)
要提供一个代码示例来补充上面的答案:
Array a(3);
a[0] = 2.0; //non-const version called on non-const 'a' object
const Array b(3);
double var = b[1]; //const version called on const 'b' object
const Array c(3);
c[0] = 2.0; //compile error, cannot modify const object