Const和非Const运算符重载

Jam*_*lks 23 c++ const operator-overloading

我有一个话题,我很困惑,我需要详细说明.它是使用const版本和非const版本重载的运算符.

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

我理解这个函数的一部分,取一个索引并检查它的逻辑,返回类中数组数据的索引.还有一个具有相同主体的函数,但函数调用为

const double &operator[](int idx) const
Run Code Online (Sandbox Code Playgroud)

为什么我们需要两个版本?

此示例问题也可能有助于详细说明.下面的每个实例使用哪个版本?

Array a(3);
a[0] = 2.0;
a[1] = 3.3;
a[2] = a[0] + a[1];
Run Code Online (Sandbox Code Playgroud)

我的假设是只调用const版本,a[2]因为我们不想冒险修改a[0]a[1].

谢谢你的帮助.

AnT*_*AnT 27

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

在您的代码中,示例a是非const对象,这意味着const在所有情况下都会调用非版本.您的样本中永远不会调用该const版本.

有两个版本的要点是对非const对象实现"读/写"访问,对对象只实现"读取"访问const.对于调用的const对象const版本operator [],它返回一个const double &引用.您可以通过该const引用读取数据,但是您无法通过它进行写入.


ech*_*cho 6

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

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
Run Code Online (Sandbox Code Playgroud)