数组下标运算符重载

Mah*_*esh 2 c++ operator-overloading

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

错误C2679:二进制'=':没有找到一个类型'int'的右手操作数(或者没有可接受的转换)的
运算符可能是'Array&Array :: operator =(const Array&)',同时试图匹配参数列表'(Array,int)'

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

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

Ebo*_*ike 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;
}
Run Code Online (Sandbox Code Playgroud)

  • "所以它评估成一个Array对象"是一个非常奇怪和含糊的说法.我要说它假设obj是连续数组中的第一个,并且移动到第(i + 1)个(数组索引为0).然后发生的是它试图将i直接分配给该地址处的Array对象,并且没有`Array :: operator =(int)`或`Array(int)`构造函数,所以这是不可能的.同样;-),像这样的无声错误会产生未定义的运行时行为,更难以注意和修复. (2认同)