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 を指している場合、それをインクリメントして、呼び出されたインデックスの値を返すにはどうすればよいですか?

言うまでもなく、何のためにオーバーロードしているのか正確にはわかりません。2 つのインデックス演算子の 2 つのオーバーロードは同じように見えます。彼らのために何をすべきかわかりません。

私の先生は、代入演算子はコピー コンストラクターのようなものだと言いました。私は次のように書きました。

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

この演算子は「代入」array1を意味thisし、「コピー演算子」とも呼ばれます。通常、データ型に応じてコピーすることで実装されarray1ます。thisこれはmemcpy、基本的な配列を使用して実現できます。

比較演算子:

bool operator == (Array const& array1);

繰り返しますが、これは「比較thisするarray1」という意味です。データ型が使用しているロジックを使用して、 data in が data inthisと等しいかどうかを判断しarray1ます。memcmpこれは、基本的な配列型を使用して実現できます。

インデックス演算子

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

これらは基本的に同じ演算子ですが、そのうちの 1 つは、配列に書き込むことができない「読み取り専用」バージョンです。

この演算子は、「アイテムをインデックスに配置する」という意味ではなく、「アイテムを配置できるインデックスへの参照を与える」という意味であるため、混乱を招く可能性があります。これは、割り当てが外部で行われることを意味します。たとえば、次のステートメントです。

myarray[idx] = item;

実際には 2 つのステートメントです (注: これは Array クラスが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、代入連鎖などのために現在の配列への参照を返すために戻る必要があります。

array1のすべての値を(呼び出されたオブジェクト) とbool operator == (Array const& array1);比較したい場合があります。this最初に配列のサイズを比較して同じであることを確認することで、これを少し最適化できます。

于 2011-03-06T21:59:23.570 に答える
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 に答える
0

あなたが書くとき:

a = b; 

C++ コンパイラの呼び出し:

a.operator=(b). 

したがって、operator=()実装では、オブジェクト b の値をオブジェクト a に割り当てる (そして a を返す) 必要があります。メンバー関数ではa、ポインターを介してアクセスできることに注意してくださいthis

于 2011-03-06T22:06:28.590 に答える