在重载数组索引运算符Array obj;
时,我无法理解Array* obj = new Array;
和[]
之间的区别。当我有一个指向该对象的指针时,我会在 VS 2010 上收到这些错误消息。
错误C2679:二进制'=':找不到哪个运算符采用'int'类型的右手操作数(或者没有可接受的转换)
尝试匹配参数列表'(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;
}
有人可以解释这两种运算符重载实例之间的基本原理吗?感谢。
答案 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
。每次 时你都应该怀疑!