2014年4月1日火曜日

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




演算子をオーバーロードすると、クラスごとに

演算子の機能を定義できるようになります(^^)


因みにオーバーロードは、日本語で書くと

多重定義です。



一方、言葉が似ているため、とても間違いやすく混同しがちなオーバーライドは

機能の上書き、あるいは再定義となります。(^^;)

何度も繰り返し唱えて、覚えてしまいたいものです...(^^ゞ

さて、演算子のオーバーロードですがC++では、 + や - といった既にある

演算子に対して、独自の機能を定義することができます。

使いどころとしては、単純に四則演算しただけでは期待する結果に

ならないだとか、2つ以上のあるデータの組に対して演算を行いたい場合

などが当てはまるでしょう(^^)

ここでは、+演算子をオーバーロードして、オブジェクト同士の加算を

行ってみたいと思います。 

時刻の加算結果を求めるサンプルです。

#include <iostream>

using namespace std;

class ClockTime {
public:
    ClockTime() {};
    ClockTime(int nHour, int nMinute) {
        m_nHour = nHour;
        m_nMinute = nMinute;
    }
    ClockTime operator+ (const ClockTime &Ct2);

    int m_nHour;
    int m_nMinute;
};

// +演算子のオーバーロード
ClockTime ClockTime::operator+ (const ClockTime &Ct)
{
    int nHourBuf = 0;
    int nMinuteBuf = 0;
    int nTotal = 0;

    nTotal = (m_nHour * 60 + m_nMinute) + (Ct.m_nHour * 60 + Ct.m_nMinute);
    nHourBuf = nTotal / 60;
    nMinuteBuf = nTotal % 60;

    // 自分自身と同じクラスのオブジェクトを戻す
    return ClockTime(nHourBuf, nMinuteBuf);
}

int main(void)
{
    ClockTime Ct1(1, 23);  // 1時間23分
    ClockTime Ct2(4, 56);  // 4時間56分
    ClockTime Ct3;

    // オブジェクト同士を加算
    Ct3 = Ct1 + Ct2;

    // この例で期待通りとなる値は 6時間19分
    cout << Ct3.m_nHour << "時間 " << Ct3.m_nMinute << "分" << endl;

    return 0;
}

実行結果
# ./test
6時間 19分

いつものようにたいしておもしろくないプログラムですが、

期待通りの結果となりました。(^_^;)

ClockTimeクラスの中で、 operator+() 関数を定義しているため

Ct3 = Ct1 + Ct2; の式での + は、Ct1オブジェクトの operator+()が

呼ばれるようになります。

また、ClockTime ClockTime::operator+ (const ClockTime &Ct) の

引数として渡されるているのが、Ct2オブジェクトとなっています。

結果、時刻を加算するという +演算子のオーバーロードができました(^_^;)

ちなみに、 -演算子では operator-()関数をオーバーロードします。

*, / といった他も同様です。

オブジェクト指向の素晴らしさを垣間見ることができますね。

今日の名言
現在の一瞬はこのうえなく素晴らしい一瞬である。今、夕食に5分遅れることは、
十年間の大きな悲しみより重要である。
                              サミュエル・バトラー

いくら苦しくても現実をしっかり見つめることだ。目標をしっかり定める。
いったん目標が定まったら、ありとあらゆる時間をその実現のために
注ぎ込む。自分の決心が正しいかどうか心配して、貴重な時間を浪費
するな。あくまでやり通せ!
                              デール・カーネギー

過ぎ去りし麗しき一日は、再び我がもとに帰り来たらず。
                              アルフレッド・テニソン卿

我々はここにいる。そしてそれは今だ。それより先のことについての人間の
知識は、すべて月光のごとくとりとめがない。
                              ヘンリー・L・メンケン