1

对于学校,我得到了一个类接口来定义我自己的数组类(不是继承的)。

我在重载赋值运算符 (=) 和比较运算符 (==) 以及索引运算符时遇到问题。

这是在类界面中给我的:

Array& operator = (Array const& array1);   // overload assignment operator
bool operator == (Array const& array1);    // overload == operator

int const& operator [] (unsigned int index) const;   // overload index operator
int& operator [] (unsigned int index);      // overload index operator

我似乎无法理解的是如何分配它。如果要将要分配给新变量的数组传递给函数=如何返回该数组的值以将其分配给新变量。还是我只是分配一个新的内存位置,然后它会自动将它分配给所谓的函数?

使用 == 运算符,我怎么知道它与什么比较?我如何比较值,我不知道如何引用所谓的函数?

我几乎不知道如何重载索引运算符。如果使用索引运算符的变量指向数组中的第一个 int,我如何递增它以返回被调用的索引的值?

更不用说,我不确定我们重载它到底是为了什么,而且两个索引运算符的两个重载看起来是一样的。我不知道该为他们做什么。

我的老师告诉我赋值运算符就像复制构造函数一样,我是这样写的:

Array::Array(Array const& oldarray)
{
   int *arraycopy;
   arraycopy = new int[oldarray.length] // length is a member variable that has already been initiated
   for(int i = 0; i < oldarray.length; i++) {
      arraycopy[i] = oldarray[i];
   }
}

赋值运算符也是一样的吗?我对这一切感到困惑,我将非常感谢任何和所有的帮助!谢谢!

4

4 回答 4

4

首先,重要的是您要了解您提到的运算符在this. 根据您选择重载的运算符,每个都为您提供不同的变量:

赋值运算符:

Array& operator = (Array const& array1);

该运算符的意思是“赋值array1this”,也称为“复制运算符”。通常它会根据数据类型通过复制array1来实现。this这可以使用memcpy基本数组来实现。

比较运算符:

bool operator == (Array const& array1);

同样,这意味着“比较thisarray1。它应该非常简单 - 使用数据类型使用的任何逻辑来确定数据 inthis是否等于array1. 这可以使用memcmp基本数组类型来实现。

索引运算符

int& operator [] (unsigned int index);
int const& operator [] (unsigned int index) const;

这些基本上是相同的运算符,但是其中一个是“只读”版本,您无法写入数组。

这个操作符可能会让人感到困惑,因为它并不意味着“将项目放在索引处”,而是意味着“给我一个索引参考,我可以把我的项目放在哪里”。这意味着赋值是在外部完成的,例如,语句:

myarray[idx] = item;

实际上是两个语句(注意:这假设您的 Array 类是 Array of ints):

// Reference to the index location
int& writeLocation = myarray[idx];

// Write item to the location
writeLocation = item;

此运算符的实现因数据类型的实现而异。

于 2011-03-06T22:04:31.943 回答
2

使用赋值运算符,您的数组可能已经被分配(即大小> 0)。因此,您需要释放任何现有内存/或其他一些方案,以确保您的两个数组大小相同。赋值运算符应该返回*this以返回对当前数组的引用,以进行赋值链接之类的操作。

因为bool operator == (Array const& array1);您希望将 array1 中的所有值与this(被调用对象)进行比较。您可以通过首先比较数组的大小以确保它们相同来对此进行一些优化。

于 2011-03-06T21:59:23.570 回答
0

当你写:

a = b; 

您的 c++ 编译器调用:

a.operator=(b). 

因此,在您的operator=()实现中,您需要将对象 b 值分配给对象 a(然后返回 a)。请记住,在成员函数中,a可以通过指针访问this

于 2011-03-06T22:06:28.590 回答
0

一般来说,赋值运算符看起来像

Array& Array::operator = (Array const& rhs)
{
    if (*this != rhs) // prevent self-copying
    {
        delete[] this->array;
        this->array = new int[rhs.length];
        //copy array;
        // copy all other members - if they are pointers, don't forget to free memory first;
    }
    return *this;
}
于 2011-03-06T22:11:38.820 回答