[英]Array subscript operator overloading
我无法理解Array obj;
之间的区别Array obj;
和Array* obj = new Array;
同时重载数组索引operator []
。 当我有一个指向该对象的指针时,我在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;
}
有人可以解释运算符重载的两种实例之间的基本原理吗? 谢谢。
在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;
}
您为Array
定义了operator[]
,而不是为Array*
。 在注释掉的代码中,您将创建一个Array*
。 实际上,您不能为任何指针类型重载运算符。 将[]
应用于指针会将其视为数组,将数组索引转换为指针算法。 因此,将[]
应用于Array*
产生一个Array
(实际上是一个Array&
)。 您不能将int
分配给Array
因为您没有定义它(也不想定义)。
现代的,编写良好的C ++很少使用关键字new
。 您不应怀疑您的C ++代码不包含关键字new
。 每次它时你应该怀疑!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.