+=演算子のオーバーロード
http://www.geocities.jp/ky_webid/cpp/language/017.html
+をオーバーロードするなら+=もやっておきましょう。
結局のところ、書き方の違いだけでやりたいことは同じですからね。
#include <iostream> class CNum { public: int m_num; CNum (int num); void operator+=(CNum& obj); // +=のオーバーロード int getNum(); }; CNum::CNum(int num) { this->m_num = num; } void CNum::operator+=(CNum& obj) { this->m_num += obj.m_num; } int CNum::getNum() { return this->m_num; } int main() { CNum num1(100); CNum num2(50); num1 += num2; std::cout << num1.getNum() << std::endl; return 0; }
$ main 150
+=は戻り値なんてないのでvoidでやってみたんですが、下記のように書いたときにコンパイルエラーになってしまいました。
CNum num3 = num1 += num2;
この場合の挙動としてはやはりnum3にはnum1の値が値渡しで格納されて欲しいですよね。
ということで戻り値も返すようにしました。
#include <iostream> class CNum { public: int m_num; CNum (int num); CNum operator+=(CNum& obj); // +=のオーバーロード int getNum(); }; CNum::CNum(int num) { this->m_num = num; } CNum CNum::operator+=(CNum& obj) { this->m_num += obj.m_num; return *this; } int CNum::getNum() { return this->m_num; } int main() { CNum num1(100); CNum num2(50); CNum num3 = num1 += num2; std::cout << num3.getNum() << std::endl; return 0; }
うまくいきました。
元記事のケースでは+=の戻り値に参照を返していましたが、それって意味があるのでしょうか。
受け取り側がCNum& num3のように参照で受け取れるようにするためってことですかね。
そういう意味では参照で返しとかないとまずいのかな。いざ参照で受け取りたいってなったときに出来ないわけだから。
色々複雑に入り組んでますね、この辺。