続いて代入演算子のオーバーロードについて説明します。
代入演算子は「=」「+=」「-=」「*=」「/=」「%=」などを指します。
他にもありますが、割愛します。
代入ですから、クラスのメンバ変数を書き換えますので関数の後ろに「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 続行するには何かキーを押してください・・・
簡単ですね。