ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

演算子が定義できてイイ

解説

たとえば、複素数を表現する構造体 Complex を作ったとします。その構造体には実部・虚部を表す2つのメンバがあります。

Complex 型の2つの変数の和を計算するためには、通常、各メンバを別々に足す必要があります。具体的には次のようになるでしょう。

SAMPLE CODE
#include <iostream.h>

struct Complex {
    int m_nRe;
    int m_nIm;
};

void main()
{
    Complex C1 = { 10, 20 };
    Complex C2 = { 30, 40 };
    Complex C3;
    
    C3.m_nRe = C1.m_nRe + C2.m_nRe;
    C3.m_nIm = C1.m_nIm + C2.m_nIm;
    cout << "Re=" << C3.m_nRe << endl;
    cout << "Im=" << C3.m_nIm << endl;
}


実行結果:
Re=40
Im=60

複素数の足し算は単純なのに、毎回実部と虚部を別々に足すのは面倒です。こういう場合のため、C++ では演算子の動作を自由に定義することが可能です。足し算の演算子 + は operator+ という関数で定義されます。演算子 + は2つのパラメータをとる2項演算子なので、operator+ 関数も2つのパラメータをとります。また、戻り値として和を返します。

具体的には、次のようになります。

SAMPLE CODE
#include <iostream.h>

struct Complex {
    int m_nRe;
    int m_nIm;
};

Complex operator+( Complex& LHS, Complex& RHS )
{
    Complex Sum;
    Sum.m_nRe = LHS.m_nRe + RHS.m_nRe;
    Sum.m_nIm = LHS.m_nIm + RHS.m_nIm;
    
    return Sum;
}

void main()
{
    Complex C1 = { 10, 20 };
    Complex C2 = { 30, 40 };
    Complex C3;
    
    C3 = C1 + C2;
    cout << "Re=" << C3.m_nRe << endl;
    cout << "Im=" << C3.m_nIm << endl;
}


実行結果:
Re=40
Im=60

このように、面倒な操作でもひとたび演算子として定義してしまえば単純に記述できるようになります。

足し算以外にも、- * / = += ++ == などほとんどの演算子が定義可能です。cout と一緒に使う << も演算子です。よく使うのは代入演算子 = と比較演算子 == でしょう。

最後に、比較演算子の例を掲載しておきます。

SAMPLE CODE
#include <iostream.h>

struct Complex {
    int m_nRe;
    int m_nIm;
};

bool operator==( Complex& LHS, Complex& RHS )
{
    if ( ( LHS.m_nRe == RHS.m_nRe )
      && ( LHS.m_nIm == RHS.m_nIm ) ) {
        return true;
    }
    else {
        return false;
    }
}

void main()
{
    Complex C1 = { 10, 20 };
    Complex C2 = { 10, 20 };
    
    if ( C1 == C2 ) {
        cout << "Same." << endl;
    }
    else {
        cout << "Not same." << endl;
    }
}


実行結果:
Same.

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)