【问题标题】:Array subscript operator overloading数组下标运算符重载
【发布时间】:2011-02-10 02:42:43
【问题描述】:

在重载数组索引运算符[] 时,我无法理解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;
}

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

【问题讨论】:

标签: c++ operator-overloading


【解决方案1】:

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;
}

【讨论】:

  • “所以它计算为一个数组对象”是一个非常奇怪和模糊的说法。我会说它假设 obj 首先在一个连续的数组数组中,然后移动到第 (i+1) 个(数组索引从 0 开始)。然后发生的是它试图将 i 直接分配给该地址处的 Array 对象,并且没有 Array::operator=(int)Array(int) 构造函数,所以这是不可能的。也一样 ;-),因为像这样的无声错误会创建未定义的运行时行为,并且更难注意到和修复。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-14
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-08
    • 2021-10-23
    相关资源
    最近更新 更多