C++ 演算子キーワードの使用 (オーバーロードされた演算子、ファンクター、型変換演算子)

C++ アドバンスト シリーズ カタログ

C++ 演算子キーワードの使用 (オーバーロードされた演算子、ファンクター、型変換演算子)

C++11実践技術(1) autoとdecltypeの使い方

C++11実践技術(2) std::functionとバインドバインダー

C++11実践技術(3) std::future、std::promise、std::packages_task、async

意味

C++11 では、operator は演算子をオーバーロードするために使用されるキーワードです。演算子をオーバーロードすることにより、組み込み演算子を使用するときにカスタム タイプのオブジェクトがどのように動作するかを定義できます。

演算子のオーバーロードの使用法は、一般に次の 3 つのカテゴリに分類できます。

  • 演算子は演算子「±*/=」などをオーバーロードできます。
  • また、関数呼び出し演算子「operator()」をオーバーロードします。
  • 型変換演算子も実行できます

演算子 オーバーロードされた演算子

一般的な使用法:

#include <iostream>

class MyNumber {
    
    
private:
  int value;

public:
  MyNumber(int num) : value(num) {
    
    }

  int getValue() const {
    
    
    return value;
  }

  // 重载加法运算符 '+'
  MyNumber operator+(const MyNumber& other) {
    
    
    int sum = value + other.value;
    return MyNumber(sum);
  }
};

int main() {
    
    
  MyNumber num1(5);
  MyNumber num2(10);

  MyNumber sum = num1 + num2;  // 使用重载的加法运算符进行相加操作

  std::cout << "Sum: " << sum.getValue() << std::endl;

  return 0;
}

MyNumber sum = num1 + num2; オブジェクトの追加のように見えますが、実際にはオーバーロードされた + 演算子が入力されており、追加されるのはオブジェクト内のメンバー変数であることがわかります。

演算子 オーバーロードされた関数呼び出し演算子

class Adder {
    
    
public:
  int operator()(int a, int b) {
    
    
    return a + b;
  }
};
// 使用函数对象进行加法运算
Adder add;
int result = add(3, 4);  // 调用 operator(),返回结果 7

add は関数と同じように思えますが、そうではなく、関数呼び出し演算子をオーバーロードすると、インスタンス化された add オブジェクトを関数のように使用できます。これはファンクターとしても知られています(この言葉は非常に鮮やかです)。

演算子の型変換演算子

型変換演算子は、クラス型の値を他の型の値に変換する変換を定義する特別なクラス メンバー関数です。変換演算子はクラス定義の本体内で宣言され、その後に予約語演算子、その後に変換のターゲットの型が続きます。

class MyType {
    
    
public:
	using fr_t = void(*)(int);
	static void func(int a)
	{
    
    
		std::cout << "the value:" << a << std::endl;
	}
	operator fr_t() {
    
    
	// 执行适当的转换操作
	// 将 MyType 转换为 fr_t
	return func;//这里是将函数指针赋给了fr_t
  }
};

// 使用类型转换运算符进行类型转换
MyType obj;
obj(2);  // 这里涉及到两步动作:一是调用 operator fr_t(),将 obj 转换为 fr_t 类型;二是调用了fr_t(2)

原則: 変換関数はメンバー関数である必要があり、戻り値の型は指定できず、仮パラメーター テーブルは空でなければなりません。戻り値は暗黙的であり、戻り値は変換された型、つまり関数と同じです。上記のプロトタイプのポインター型 fr_t と、返される関数 func が対応している必要があります。

obj(2); このコード行の実行プロセスは少し理解するのが難しく、次の 2 つのステップに分けることができます。

  • 1 つは、演算子 fr_t() を呼び出して obj を fr_t 型に変換することです。
  • 2 番目の方法は、fr_t(2) を呼び出すことです。ここでは、fr_t 関数ポインタが func を指しているため、直接呼び出すことができます。

おすすめ

転載: blog.csdn.net/weixin_44477424/article/details/132122221