数组下标运算符重载

时间:2011-02-10 02:42:44

标签: c++ operator-overloading

在重载数组索引运算符Array obj;时,我无法理解Array* obj = new Array;[]之间的区别。当我有一个指向该对象的指针时,我会在 VS 2010 上收到这些错误消息。

错误C2679:二进制'=':找不到哪个运算符采用'int'类型的右手操作数(或者没有可接受的转换)
    尝试匹配参数列表'(Array,int)'

时,可能是'Array& Array :: operator =(const Array&)'
#include <iostream>
class Array
{
    int arr[10] ;

    public:
       int& operator[]( int index )
       {
           return arr[index] ;
       }
};

int main()
{
    //Array* obj = new Array; Error

    Array obj;   // Correct
    for( int i=0; i<10; ++i )
        obj[i] = i;

    getchar();
    return 0;
}

有人可以解释这两种运算符重载实例之间的基本原理吗?感谢。

2 个答案:

答案 0 :(得分:10)

如果是Array *obj,则obj[i]相当于*(obj+i),因此它会计算为Array个对象。

你必须这样做

int main()
{
    Array* obj = new Array;

    for( int i=0; i<10; ++i )
        (*obj)[i] = i;

    getchar();
    return 0;
}

答案 1 :(得分:1)

您为operator[]定义了Array,而不是Array*。在注释掉的代码中,您创建了一个Array*。实际上,您不能为任何指针类型重载运算符。将[]应用于指针会将其视为数组,将数组索引转换为指针算法。因此,将[]应用于Array*会产生Array(实际为Array&)。您无法将int分配给Array,因为您没有定义(并且也不想定义)。

现代的,编写良好的C ++很少使用关键字new。您不应怀疑您的C ++代码不包含关键字new。每次 时你都应该怀疑!