★代入演算子オーバーロード★


続いて代入演算子のオーバーロードについて説明します。

代入演算子は「=」「+=」「-=」「*=」「/=」「%=」などを指します。

他にもありますが、割愛します。

代入ですから、クラスのメンバ変数を書き換えますので関数の後ろに「const」は付きません。

代入演算子には戻り値というイメージはあまり無いと思いますが、

a = b = c = 0;

のようなケースでは戻り値が無ければ対応出来ません。


=演算子のオーバーロード


とりあえず、サンプルを書いてみます。

<sample program cpp065-01>

#include <iostream>

class Sample {
public:

    Sample();

    Sample(const int value);

    void Show() const;

    Sample& operator=(const Sample &rhs);

private:

    int m_value;
};

int main()
{   
    Sample sample1(12);
    Sample sample2;

    sample2 = sample1;

    sample2.Show();

    return 0;
}

Sample::Sample()
{

}

Sample::Sample(const int value) : m_value(value)
{

}

void Sample::Show() const
{
    std::cout << "m_value = " << m_value << std::endl;
}

Sample& Sample::operator=(const Sample &rhs)
{
    m_value = rhs.m_value;

    return *this;
}

<実行結果>

m_value = 12
続行するには何かキーを押してください・・・

まず、プロトタイプ宣言を見ましょう。

Sample& operator=(const Sample &rhs);

引数は右辺です。

戻り値はクラスの参照を戻すように書きます。

関数内部もみてみましょう。

Sample& Sample::operator=(const Sample &rhs)
{
    m_value = rhs.m_value;

    return *this;
}

中では、メンバ変数をコピーしています。

コピーされた自分自身の参照を返すため、「thisポインタ」の中身(自分自身)をreturnしています。

こうしておけば、

sample3 = sample2 = sample1;

と言ったケースにも対応できます。


ただ、気づいた方もいるかも知れません・・・

オーバーロードしなくても、構造体と同じように元々代入出来るのでは?

試してみましょう。

<sample program cpp065-02>

#include <iostream>

class Sample {
public:

    Sample();

    Sample(const int value);

    void Show() const;

private:

    int m_value;
};

int main()
{   
    Sample sample1(12);
    Sample sample2;

    sample2 = sample1;

    sample2.Show();

    return 0;
}

Sample::Sample()
{

}

Sample::Sample(const int value) : m_value(value)
{

}

void Sample::Show() const
{
    std::cout << "m_value = " << m_value << std::endl;
}

<実行結果>

m_value = 12
続行するには何かキーを押してください・・・

全然出来ますね。

クラスは構造体と同じで、クラスを作った時点で「=」演算子は使えるようになっています。

わざわざオーバーロードする必要は無いのですが、用意されていると言う事は意味があるのです。

どのような場合に使うのかは、もう少し先の章で説明します。


+=などのオーバーロード


その他の代入演算子のオーバーロードについて説明します。

基本は「=」演算子のオーバーロードと同じで、途中に演算が入るだけです。

<sample program cpp065-03>

#include <iostream>

class Sample {
public:

    Sample();

    Sample(const int value);

    void Show() const;

    Sample& operator+=(const Sample &rhs);

private:

    int m_value;
};

int main()
{   
    Sample sample1(12);
    Sample sample2(18);

    sample2 += sample1;

    sample2.Show();

    return 0;
}

Sample::Sample()
{

}

Sample::Sample(const int value) : m_value(value)
{

}

void Sample::Show() const
{
    std::cout << "m_value = " << m_value << std::endl;
}

Sample& Sample::operator+=(const Sample &rhs)
{
    m_value += rhs.m_value;

    return *this;
}

<実行結果>

m_value = 30
続行するには何かキーを押してください・・・

簡単ですね。


次へ

戻る

目次へ