工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C++演算子オーバーロード:コード例付き実践ガイド

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

C++で演算子オーバーロードを使用すると、同じスコープ内で1つの演算子に複数の意味を割り当てられます。目的は、ユーザー定義型に対して演算子にカスタム動作を与えることです。

演算子オーバーロードにより、ほとんどのC++演算子を再定義し、1つの記号で異なる操作を実行できるようになります。

このチュートリアルで学ぶ内容:

構文

C++演算子をオーバーロードするには、クラス内部で特殊なメンバ関数を以下のように定義します:

class class_name {
    ...
public:
    return_type operator symbol (argument(s)) {
        ...
    }
    ...
};

構成要素:

例1:

#include <iostream>
using namespace std;
class TestClass {
private:
    int count;
public:
    TestClass() : count(5) {}
    void operator --() {
        count = count - 3;
    }
    void Display() {
        cout << "Count: " << count;
    }
};
int main() {
    TestClass tc;
    --tc;
    tc.Display();
    return 0;
}

出力:

前置デクリメントオーバーロードの実行結果

コードのスクリーンショット:

例1のソースコード

コード解説:

  1. 入出力機能のため<iostream>をインクルード
  2. 簡潔さのためstd名前空間を使用
  3. TestClassクラスを定義
  4. countをプライベートデータメンバに
  5. countを5で初期化するパブリックコンストラクタを提供
  6. 前置--演算子をオーバーロードし、countから3を減算
  7. 現在値を出力するDisplay()を実装
  8. main()でインスタンス作成、オーバーロード演算子適用、結果表示

C++での演算子オーバーロードの異なるアプローチ

オーバーロードは以下で実現可能:

  1. メンバ関数
  2. 非メンバ関数(フレンド関数またはフリー関数)
  3. フレンド関数(プライベートデータアクセスが必要な場合)

すべてのC++演算子をオーバーロードできるか?

いいえ。以下の演算子はオーバーロード不可です:

覚えておくべきこと

  1. オーバーロードはユーザー定義型のみに影響;組み込み型は元の動作を保持
  2. 代入(=)とアドレス取得(&)演算子は、コピーコンストラクタや代入演算子を提供するクラスで自動的にオーバーロードされる
  3. 演算子の優先順位は変更されない;評価順序を強制するには括弧を使用
  4. 3つの演算子—::、.、?:—は明示的にオーバーロード禁止

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

演算子をオーバーロードする方法

例1:インクリメント演算子

#include <iostream>
using namespace std;
class OperatorOverload {
private:
    int x;
public:
    OperatorOverload() : x(10) {}
    void operator ++() {
        x += 2;
    }
    void Print() {
        cout << "The Count is: " << x;
    }
};
int main() {
    OperatorOverload ov;
    ++ov;
    ov.Print();
    return 0;
}

出力:

前置インクリメントオーバーロードの実行結果

コードのスクリーンショット:

例1のソースコード

コード解説:

  1. <iostream>をインクルードしstd名前空間を使用
  2. プライベートint xを持つOperatorOverloadクラスを定義
  3. コンストラクタでxを10で初期化
  4. 前置++演算子をオーバーロードし、xに2を加算
  5. 更新値を表示するPrint()を実装
  6. main()でオブジェクト作成、オーバーロード演算子呼び出し、結果出力

例2:複素数の加算

#include <iostream>
using namespace std;
class TestClass {
private:
    int real, over;
public:
    TestClass(int rl = 0, int ov = 0) : real(rl), over(ov) {}
    TestClass operator + (TestClass const &obj) {
        TestClass result;
        result.real = real + obj.real;
        result.over = over + obj.over;
        return result;
    }
    void print() {
        cout << real << " + i" << over << endl;
    }
};
int main() {
    TestClass c1(9, 5), c2(4, 3);
    TestClass c3 = c1 + c2;
    c3.print();
}

出力:

複素数加算オーバーロードの実行結果

コードのスクリーンショット:

例2のソースコード

コード解説:

  1. <iostream>をインクルードしstd名前空間を使用
  2. realとoverコンポーネントを持つTestClassを定義
  3. 初期化用コンストラクタを提供
  4. +演算子をオーバーロードし複素数加算を実行
  5. 和を含む新しいTestClassインスタンスを返却
  6. 複素数を表示するprint()を実装
  7. main()で2インスタンス作成、加算、結果出力

まとめ

C言語

  1. C++配列を関数に渡す完全ガイド:1次元・多次元配列の実例付き
  2. C++演算子を徹底解説:種類、例、サンプルプログラム付き
  3. C++ do-while文:構文、実践例、ネストしたループ
  4. C++ポインタをマスター:概念、例、実践的応用
  5. C++ char型をマスター:宣言、ASCII、変換テクニック
  6. C++構造体を実例で徹底解説
  7. C++のstd::listをマスターする:構文、関数、実践例
  8. C++関数を実例で徹底解説:基本から応用まで
  9. Python演算子オーバーロード完全ガイド:__add__、__lt__など特殊メソッドでOOP設計を強化
  10. Pythonラムダ関数をマスターする:実例とベストプラクティス
  11. Python round()関数を実例で徹底解説