【问题标题】:Implementing a C++ array class实现 C++ 数组类
【发布时间】:2011-03-06 21:53:17
【问题描述】:

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

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

这是在课堂界面给我的:

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

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

【问题讨论】:

    标签: c++ arrays class dynamic-arrays


    【解决方案1】:

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

    赋值运算符:

    Array& operator = (Array const& array1);
    

    此运算符的意思是“将array1 分配给this”,也称为“复制运算符”。 通常它会通过将array1 复制到this 来实现,具体取决于数据类型。这可以使用memcpy 来实现基本数组。

    比较运算符:

    bool operator == (Array const& array1);
    

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

    索引运算符

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

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

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

    myarray[idx] = item;
    

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

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

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

    【讨论】:

    • 那么这对于只读索引运算符是否正确:int const&amp; Array::operator [] (unsigned int index) const { return this-&gt;data[index]; } 其中 data 是保存数组变量的成员变量?
    • 这看起来完全正确!请注意,this-&gt;member 在大多数情况下在 C++ 中是多余的,{ return data[index]; } 也可以。
    • 非常感谢,我真的很感激。我对两个索引运算符都做了完全相同的事情,它们应该相同还是我需要为非只读索引运算符做任何额外的事情?
    • 您已经引用constint const&amp; 类型的返回值)这一事实将使编译器处理“只读”部分。让两个实现具有相同的代码是正确的——它甚至可以被称为“const 正确”。完成后不要忘记选择正确的答案!
    • 所有的答案都对我有帮助,但你对我的帮助最大。非常感谢!
    【解决方案2】:

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

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

    【讨论】:

    • 好的,谢谢您的帮助。但我写了这个,我得到了一个错误:bool Array::operator == (array const&amp; array1) { if (this.length() != array1.length) },它已经给了我一个关于“this”关键字的错误“错误:表达式必须有类类型”
    • this 是您需要取消引用它的指针,即。 this-&gt;length()array1.length()
    【解决方案3】:

    当你写的时候:

    a = b; 
    

    您的 c++ 编译器调用:

    a.operator=(b). 
    

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

    【讨论】:

      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-26
        • 1970-01-01
        相关资源
        最近更新 更多