多个operator []重载

时间:2015-10-21 00:01:16

标签: c++

看看这个简单的数组类

class Array {
    const unsigned int _size;
    int _array[100];

public:
    Array() : _size(100) {
        for(unsigned int i = 0; i < _size; i++)
            _array[i] = 0;
    }

    int& operator[](unsigned int index) {
        cout << "normal operator[].\n";
        return _array[index];
    }

    const int& operator[](unsigned int index) const {
        cout << "const operator[].\n";
        return _array[index];
    }
};

int main()
{
    Array a;

    a[3] = 1;
    cout << a[3] << "\n";

    system("pause");
    return 0;
}

“normal operator []”行执行两次,但我希望第二次调用(cout << a[3] << "\n";)使用重载运算符的const版本,因为它不会更改数组本身。

为什么?有没有办法强制按我的意愿调用const版本?

2 个答案:

答案 0 :(得分:1)

当你有一个方法的重载const版本时,当对象是const时将调用const版本。例如:

#include <iostream>
using namespace std;

class MyClass
{
public:

    void foo()
    {
        cout << "foo()" << endl;
    }

    void foo() const
    {
        cout << "foo() const" << endl;
    }
};

int main()
{
    MyClass a;
    const MyClass b;

    a.foo();
    b.foo();

    return 0;
}

将为对象foo()调用正常a,为对象b调用const版本。

在您的情况下,您只需要避免尝试分配const版本。例如:

Array a;
const Array b;

a[3] = 1;
// b[3] = 1; // error
cout << a[3] << "\n";
cout << b[3] << "\n";

工作正常。但是,如果您尝试将作业分配给b,则会出现编译错误。

答案 1 :(得分:0)

std::ostream &operator<<(int x)不会将其参数设为const(因为const在按值传递时不是很有用),因此可以调用非const operator[]

那么,什么时候会const operator[]被召唤?

除了一些边缘情况之外,const vector变量声明几乎总是无用的。主要原因const operator[]很重要,而且您经常会看到它使用的主要原因是在参考参数上调用它。

int readStuff(const std::vector<int> &dontMutateMe) {
    return dontMutateMe[42]; // const
}

Constant reference parameters are valuable,此代码在没有const operator[]的情况下无效。