' P '

whatever I will forget

C++ Overloading Operator

おいおい、ちょっと待って!オペレーターまでOverloadできんの!?
全く知りませんでした。
頻繁にそういう自作のオペレーターで色々するのなら、役に立つのかな、、、
まあ、つべこべ考えずにまずはコード。

クラスのMember内でオーバーロード

sample.h

class Sample {
public:
    char *str;
private:
    // lowercaseに変える
    Sample operator-() const;
    // 文字列をくっつける
    Sample operator+(const Sample &rstr) const;
    // Constructor等は省略
}

sample.cpp

Sample Sample::operator-() const {
    char *buf = new char[ std::strlen(str) +1 ];
    std::strcpy(buf, str);
    for (size_t i{0}; i < std::strlen(buf); i++) {
        buf[i] = std::tolower(buf[i]);
    Sample tmp {buf};
    delete [] buf;
    return tmp;
}

Sample Sample::operator+(const Sample &rstr) const {
    char *buf = new char[ std::strlen(str) + std::strlen(rstr.str) +1 ];
    std::strcpy(buf, str);
    std::strcat(buf, rstr.str);
    Sample tmp {buf};
    delete [] buf;
    return tmp;
}

main.cpp

int main() {
    Sample HHH {"HHH"};
    Sample JJJ {"FFFF"};
    
    // overloadされた+オペレータが呼ばれる。値は'HHHJJJ'
    HHH + JJJ;
    // overloadされた-オペレータが呼ばれる。値は'hhh'
    Sample XXX = -HHH;
}

上記の例は、引数の左側(+の場合ね) は必ずSampleクラスのオブジェクトでないといけません。
こんな感じですが、メンバ変数じゃない変数を使っちゃうとエラーになってしまいます。
そんなときは!

Non-Memberとしてオーバーロード

sample.h

class Sample {
public:
    char *str;
private:
    // lowercaseに変える
    friend Sample operator-(Sample &obj) const;
    // 文字列をくっつける
    friend Sample operator+(const Sample &lstr, const Sample &rstr) const;
    // Constructor等は省略
}

あとは省略しますが、上記のようにしておけば、クラスのメンバ外で
Cスタイルstringので、Sample ZZZ = "AAA" + HHHとかもいけるって感じです!