下标运算符重载

下标运算符operator[]和函数调用运算符类似,也是二元运算符。除了二元运算符的规范外,下标运算符必须是非静态成员函数

示例

class IntVector {
public:
    IntVector(int cElements);

    ~IntVector() { delete[] _iElements; }

    int &operator[](int nSubscript);

private:
    int *_iElements;
    int _iUpperBound;
};

// Construct an IntVector.
IntVector::IntVector(int cElements) {
    _iElements = new int[cElements];
    _iUpperBound = cElements;
}

// Subscript operator for IntVector.
int &IntVector::operator[](int nSubscript) {
    static int iErr = -1;

    if (nSubscript >= 0 && nSubscript < _iUpperBound)
        return _iElements[nSubscript];
    else {
        cout << "Array bounds violation." << endl;
        return iErr;
    }
}

// Test the IntVector class.
int main() {
    IntVector v(10);
    int i;

    for (i = 0; i <= 10; ++i)
        v[i] = i;

    v[3] = v[9];

    for (i = 0; i <= 10; ++i)
        cout << "Element: [" << i << "] = " << v[i] << endl;
}

结果

Array bounds violation.
Array bounds violation.
Element: [0] = 0
Element: [1] = 1
Element: [2] = 2
Element: [3] = 9
Element: [4] = 4
Element: [5] = 5
Element: [6] = 6
Element: [7] = 7
Element: [8] = 8
Element: [9] = 9
Array bounds violation.
Element: [10] = 10
  • 重载下标运算符函数返回的是左值引用,所以可用于等号左右侧
  • 当下标值为10时,超出了数组界限,返回静态int值引用并赋值为10,所以之后调用过程中超出数组界限的返回值为10