第26章 これ。2

 今回も this を使ってみたいと思います。今回のを見る前に、第3部第8章も見ておくといいと思います。


 では、今回の要点です。


 では、いってみましょう。


 第23章でやった代入演算子のオーバーロードを思い返してみて下さい。

 第3部第8章でやったように、代入演算子は再利用できます。例えば、

int n1, n2;
n1 = n2 = 0;

 では、先ず n2 = 0 が行われて、次に n1 = n2 が行われます。これは、n2 = 0 が n2 への参照を返していると考えることができるのでしたね。

 しかし、第23章のように戻り値を void にしているとこういうことができません。

CIntArray a1(1), a2(2), a3(3);
a1 = a2 = a3;  // エラー:void は代入できません

 ということで、a2 = a3 が a2 への参照を返すようにすればいいわけです。a2 は左項なので、メンバ関数を呼びだすオブジェクト自身になりますね。

 ということは、次のようにしてやればいいわけです。

プログラム1
// IntArray.h
class CIntArray
{
    // コピー
public:
    // = 演算子によるコピー
    CIntArray& operator =(const CIntArray& rother);
};
プログラム2
// IntArray.cpp
// = 演算子によるコピー
CIntArray& CIntArray::operator =(const CIntArray& rother)
{
    Copy(rother);
    return *this;
}

 this はオブジェクトのアドレスです。しかし、参照を返すときは文法的には実体をそのまま返す形にしないといけません。なので、* をつける必要がありますね。

 これで a1 = a2= a3; が実行できるようになりました。では、実際にやってみましょう。

プログラム
// TestAry.cpp
#include <iostream.h>
#include "IntArray.h"

void DispArray(const CIntArray& array)
{
    int i;

    cout << "要素数 : " << array.NumOf() << endl;
    cout << "要素 : ";
    for(i = 0; i < array.NumOf(); i++)
        cout << array[i] << ' ';
    cout << endl << endl;
}

int main()
{
    CIntArray a1(1), a2(1), a3(10);
    int       i;

    for(i = 0; i < a3.NumOf(); i++)
        a3[i] = i;

    a1 = a2 = a3;  // 例の代入

    DispArray(a1);
    DispArray(a2);
    DispArray(a3);

    return 0;
}
実行結果
コンストラクタが呼ばれました。要素数は 1 です。
コンストラクタが呼ばれました。要素数は 1 です。
コンストラクタが呼ばれました。要素数は 10 です。
要素数 : 10
要素 : 0 1 2 3 4 5 6 7 8 9

要素数 : 10
要素 : 0 1 2 3 4 5 6 7 8 9

要素数 : 10
要素 : 0 1 2 3 4 5 6 7 8 9

デストラクタが呼ばれました。要素数は 10 でした。
デストラクタが呼ばれました。要素数は 10 でした。
デストラクタが呼ばれました。要素数は 10 でした。

 代入すると、要素数は1から10に増えています。そして、要素も3つとも a3 に代入した通りのものが表示されています。きちんとコピーが行われていますね。


 では、今回の要点です。


 それでは、次回まで。


第25章 これ。 | 第27章 暗黙の了解

Last update was done on 2000.8.30

この講座の著作権はロベールが保有しています