常量和非常量运算符重载

Const and Non-Const Operator Overloading

本文关键字:常量 重载 运算符 非常      更新时间:2023-10-16

我有一个让我感到困惑的话题,我需要详细说明一下。它是带有 const 版本和非 const 版本的运算符重载。

// non-const
double &operator[](int idx) {
    if (idx < length && idx >= 0) {
        return data[idx];
    }
    throw BoundsError();
}

我知道这个lambda函数,获取索引并检查其有效性,然后返回类中数组数据的索引。还有一个具有相同主体但函数调用为

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]

感谢您的任何帮助。

当两个版本都可用时,逻辑非常简单:constconst对象调用版本,为非const对象调用非const版本。就这样。

在代码示例中,a 是一个非const对象,这意味着在所有情况下都会调用非const版本。示例中永远不会调用const版本。

拥有两个版本的要点是对非const对象实现"读/写"访问,而对const对象仅实现"读"访问。对于const对象const调用operator []版本,这将返回const double &引用。您可以通过该常量引用读取数据,但不能通过它写入。

提供一个代码示例来补充上面的答案:

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
我想

如果有这样的选择

double k = 3.0;

数组的元素是常量

a[0] = a[1] + k; or std::cout << a[0] + k;

const double &operator[](int idx) const版本将被调用。在这里,您将非常量变量添加到常量对象。