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

C++で単項マイナス演算子をオーバーロードする方法をわかりやすく解説

C++における演算子のオーバーロードとは

C++では、operatorキーワードを使って関数を宣言することで、特定の演算子記号がクラスのインスタンスに適用されたときの動作を独自に定義できます。これにより、1つの演算子に複数の意味を持たせることが可能になり、この仕組みを「オーバーロード」と呼びます。コンパイラは、オペランドの型を調べることで、演算子のそれぞれの意味を適切に区別します。

単項演算子の種類

単項演算子とは、1つのオペランドに対して作用する演算子のことです。代表的な単項演算子には、以下のようなものがあります。

  • インクリメント(++)演算子とデクリメント(--)演算子
  • 単項マイナス(-)演算子
  • 論理NOT(!)演算子

単項演算子は、呼び出し対象のオブジェクトに対して作用します。通常、これらの演算子は !obj-obj++obj のようにオブジェクトの左側(接頭辞)に置かれますが、obj++obj-- のように後置(接尾辞)形式で使われる場合もあります。

単項マイナス演算子のオーバーロード例

以下のサンプルコードは、単項マイナス(-)演算子を接頭辞形式でオーバーロードする方法を示したものです。Distanceクラスでは、operator-()をメンバー関数として定義し、フィートとインチの両方の符号を反転させています。

#include <iostream>
using namespace std;

class Distance {
   private:
      int feet;
      int inches;
   public:
      // コンストラクタ
      Distance(int f, int i) {
         feet = f;
         inches = i;
      }
      // 距離を表示するメソッド
      void display() {
         cout << "F: " << feet << " I:" << inches << endl;
      }
      // オーバーロードされたマイナス(-)演算子
      Distance operator-() {
         feet = -feet;
         inches = -inches;
         return Distance(feet, inches);
      }
};

int main() {
   Distance D1(3, 4), D2(-1, 10);
   -D1;
   D1.display();
   -D2;
   D2.display();
   return 0;
}

この例では、-D1-D2 のようにオブジェクトの前に - を付けるだけで、オーバーロードされた演算子が呼び出されます。引数を取らず、自分自身のメンバー変数の符号を反転させる点が、単項演算子のオーバーロードの特徴です。

実行結果

このプログラムをコンパイルして実行すると、次の出力が得られます。

F: -3 I:-4
F: 1 I:-10

D1(3, 4) は符号が反転されて (-3, -4) となり、D2(-1, 10) は (1, -10) となっていることが確認できます。なお、実務では元のオブジェクトを書き換えずに、符号を反転した新しいオブジェクトを返す実装にする方が安全である点にも留意するとよいでしょう。

  1. C++の単項演算子とは?種類と使い方を徹底解説

    単項演算子とは単項演算子とは、たった1つのオペランドに対して作用し、新しい値を生成する演算子のことです。C++にはさまざまな単項演算子が用意されており、それぞれ異なる役割を持っています。本記事では、代表的な単項演算子の種類とその動作について詳しく解説します。C++の主な単項演算子一覧間接参照演算子(*) - ポインタ変数に対して作用し、ポインタが指すアドレス上の値と等価なl値を返します。この操作は「デリファレンス(参照外し)」とも呼ばれます。アドレス演算子(&) - オペランドのアドレスを取得します。オペランドには、関数指定子、またはビットフィールドではなくregister記憶クラス指

  2. C++の単項演算子とは?種類・使い方を実例付きで解説

    単項演算子(unary operator)とは、1つのオペランド(被演算子)に対して作用し、新しい値を生成する演算子のことです。C++には以下のような単項演算子が用意されています。 C++の主な単項演算子一覧 演算子説明 間接参照演算子(*)ポインタ変数に作用し、そのポインタが指すアドレスにある値に相当するlvalueを返します。この操作はポインタの「デリファレンス(間接参照)」と呼ばれます。 アドレス取得演算子(&)オペランドのメモリアドレスを取得する単項演算子です。オペランドとしては、関数指定子、またはビットフィールドでなく、register記憶クラス指定子を付けずに宣言さ