C++ 数组下标运算符重载

C++ 数组下标运算符重载,c++,operator-overloading,C++,Operator Overloading,我很难理解数组obj之间的区别和数组*obj=新数组重载数组索引运算符时[]。当我有一个指向该对象的指针时,我会在VS 2010上收到这些错误消息 错误C2679:二进制“=”:未找到接受“int”类型右操作数的运算符(或没有可接受的转换) 尝试匹配参数列表(Array,int)时,可以是“Array&Array::operator=(const Array&)” #include <iostream> class Array { int arr[10] ; pub

我很难理解
数组obj之间的区别
数组*obj=新数组重载数组索引运算符时
[]
。当我有一个指向该对象的指针时,我会在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;
}
#包括
类数组
{
int-arr[10];
公众:
整型运算符[](整型索引)
{
返回arr[索引];
}
};
int main()
{
//Array*obj=新数组;错误
数组obj;//正确

对于(int i=0;i在
Array*obj
的情况下,
obj[i]
相当于
*(obj+i)
,因此它计算为
数组
对象

你必须这么做

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

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

    getchar();
    return 0;
}
intmain()
{
Array*obj=新数组;

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


现代的、良好的C++ C++使用的关键字<>代码>新< /代码>很少。你不应该怀疑C++代码中没有包含关键字<代码>新< /C>。你应该怀疑它每次<强> < <强> > /p>类似:“因此它被评估成一个数组对象”。这是一个非常奇怪和模糊的声明。我要说它假设obj是连续数组中的第一个,并移动到(I+1)第(I+1)个(数组索引基于0)。然后它尝试将I直接分配到该地址的数组对象中,并且没有

array::operator=(int)
array(int)
constructor,所以这是不可能的。同样;-),因为这样的无声错误会创建未定义的运行时行为,并且更难注意和修复。