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