C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++】演算子のオーバーロードで複素数の減算を実装する方法

演算子のオーバーロードとは

C++では、ほとんどの組み込み演算子に対して演算子のオーバーロード(多重定義)を行うことができます。オーバーロードされた演算子は、キーワードoperatorの後に定義したい演算子記号を続けた形式の関数として実装され、通常の関数と同様に戻り値の型と引数リストを持ちます。

本記事では、演算子のオーバーロードを利用して複素数の減算を行うC++プログラムを紹介し、その仕組みを詳しく解説します。

サンプルプログラム

次のプログラムは、減算演算子-をオーバーロードすることで、複素数同士の引き算を直感的な記法で実現した例です。

#include<iostream>
using namespace std;
class ComplexNum {
    private:
    int real, imag;
    public:
    ComplexNum(int r = 0, int i = 0) {
        real = r;
        imag = i;
    }
    ComplexNum operator - (ComplexNum const &obj1) {
        ComplexNum obj2;
        obj2.real = real - obj1.real;
        obj2.imag = imag - obj1.imag;
        return obj2;
    }
    void print() {
        if (imag >= 0)
            cout << real << " + i" << imag << endl;
        else
            cout << real << " + i(" << imag << ")" << endl;
    }
};
int main() {
    ComplexNum comp1(15, -2), comp2(5, 10);
    cout << "The two complex numbers are:" << endl;
    comp1.print();
    comp2.print();
    cout << "The result of the subtraction is: ";
    ComplexNum comp3 = comp1 - comp2;
    comp3.print();
    return 0;
}

実行結果

The two complex numbers are:
15 + i(-2)
5 + i10
The result of the subtraction is: 10 + i(-12)

プログラムの解説

ComplexNumクラスの定義

上記のプログラムでは、複素数の実部と虚部をそれぞれ格納するメンバ変数realimagを持つクラスComplexNumが定義されています。コンストラクタComplexNum()はこれらの値を初期化するために使用され、引数が指定されなかった場合に備えてデフォルト値として0が設定されています。該当するコードは以下の通りです。

class ComplexNum {
    private:
    int real, imag;
    public:
    ComplexNum(int r = 0, int i = 0) {
        real = r;
        imag = i;
    }
}

減算演算子のオーバーロード

オーバーロードされた演算子関数には、キーワードoperatorの後に、オーバーロード対象となる演算子記号-が続きます。この関数は2つの複素数の減算を行い、その結果をオブジェクトobj2に格納して返します。main()関数内では、この戻り値がComplexNum型のオブジェクトcomp3に代入されます。

ComplexNum operator - (ComplexNum const &obj1) {
    ComplexNum obj2;
    obj2.real = real - obj1.real;
    obj2.imag = imag - obj1.imag;
    return obj2;
}

print()関数による出力

print()関数は、複素数の実部と虚部を読みやすい形式で出力します。虚部が0以上の場合は「+ i」の形式で表示し、負の場合は括弧を付けて表示することで、符号を見分けやすくしています。

void print() {
    if (imag >= 0)
        cout << real << " + i" << imag << endl;
    else
        cout << real << " + i(" << imag << ")" << endl;
}

まとめ

このように演算子のオーバーロードを活用すると、ComplexNumのようなユーザー定義型に対しても、組み込み型と同じような自然な記法(comp1 - comp2)で演算を記述できるようになります。コードの可読性や保守性が大きく向上するため、行列やベクトルなど数学的な概念を扱うクラス設計において特に有効なテクニックです。

  1. C++で再帰を使って数値の階乗を計算する方法【初心者向け解説】

    非負整数 n の階乗(factorial)とは、n 以下のすべての正の整数を掛け合わせた値のことです。例えば、7 の階乗は次のように計算され、結果は 5040 になります。7! = 7 * 6 * 5 * 4 * 3 * 2 * 1 7! = 5040この記事では、再帰(recursion)を使って数値の階乗を求める C++ プログラムを紹介します。サンプルコード#include <iostream> using namespace std; int fact(int n) {     if ((n==0)||(n==1))  &n

  2. C++における単項演算子のオーバーロード方法を徹底解説

    C++では、operatorキーワードを使って関数を宣言することで、クラスのインスタンスに適用した際の演算子の意味を独自に定義できます。これにより、1つの演算子に複数の意味を持たせることができ、これを「オーバーロード」と呼びます。コンパイラは、オペランドの型を調べることで、どの定義を適用すべきかを判断します。 単項演算子とは 単項演算子は、1つのオペランドに対してのみ作用する演算子です。代表的な単項演算子には以下のようなものがあります。 インクリメント(++)およびデクリメント(--)演算子 単項マイナス(-)演算子 論理NOT(!)演算子 単項演算子は、それが呼び出されたオブジェクトその