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・メンケン