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

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のように参照で受け取れるようにするためってことですかね。

そういう意味では参照で返しとかないとまずいのかな。いざ参照で受け取りたいってなったときに出来ないわけだから。

色々複雑に入り組んでますね、この辺。