c++呼び出し可能オブジェクトの解惑

2301 ワード

間違いがあれば,指摘してください.
本やフォーラムを読むとき、呼び出し可能なオブジェクトの概念に遭遇することがよくあります.多くの人はこの概念を深く理解していません.関数が呼び出し可能なオブジェクトが関数だと思っている人もいますが、実は間違っています.ここで詳しく説明します.
呼び出し可能オブジェクトはc++が長い間存在していた概念で、大きく4種類に分けられ、それぞれ:1.関数ポインタ2.擬似関数3.関数ポインタに暗黙的に変換できるクラスオブジェクト
4.クラスのメンバー関数ポインタ.
 1.関数ポインタ
#include
using namespace std;
int fun(int a){ return a; };
int main()
{
	using ftype = int(*)(int);
	ftype fun1 = fun;
	cout << fun1(3) << endl;
	system("pause");
	return 0;
}

ftypeはタイプであり、fun 1は関数ポインタである.
2.シミュレーション関数は、まずシミュレーション関数という概念を簡単に説明します.クラスに演算子()が再ロードされると、このクラスのクラスオブジェクトは呼び出し可能なオブジェクトとして使用できます.
#include
using namespace std;
class example
{
public:
	example(){};
	~example(){};
	void operator()(){ cout << "example" << endl; };
};
int main()
{
	example e1;
	e1();
	system("pause");
	return 0;
}

クラスオブジェクトe 1は、関数のように呼び出すことができ、このときe 1も呼び出すことができるオブジェクトであることは明らかである.通常の関数ではありませんが、()演算子を再ロードするクラスオブジェクトはです.
出力はexampleです.
3.暗黙的に関数ポインタに変換できるクラスオブジェクト
クラスオブジェクトと他のデータ型の間で暗黙的に変換できます.ここでは、クラスオブジェクトから他のタイプに使用されますが、ここでの他のタイプは関数ポインタタイプです.使用する
operatorキーワードです.また、他のデータ型からクラスオブジェクトへの暗黙的なタイプは、変換コンストラクタまたはマルチパラメータのコンストラクタであり、あるものを除く
パラメータにはデフォルト値があります.
#include
using namespace std;
void fun()
{
	cout << "hello" << endl;
}
class example
{
public:
	using ftype = void(*)(void);
	explicit example(int num = 3){};
	~example(){};
	operator ftype(){ return fun; };
};
int main()
{
	example e1;
	e1();
	system("pause");
	return 0;
}

明らかに、e 1は関数のように呼び出され、クラスオブジェクトe 1は呼び出し可能なオブジェクトである.
4.クラスのメンバーポインタ
クラスのメンバー・ポインタは、通常のポインタの宣言と似ています.次に、その構造を示します.
戻り値タイプ(クラス名:*ポインタ名)()=&クラス名::メソッド
#include
using namespace std;
class example
{
public:
	example(){};
	~example(){};
	inline void fun(){ cout << "hello" << endl; };
};
int main()
{
	void(example::*f)(void) = &example::fun;
	example e1;
	(e1.*f)();
	system("pause");
	return 0;
}
出力はhelloです.クラスメンバー関数ポインタはマクロ定義やusingの方法で1つのタイプを規定することはできませんが、ポインタを直接宣言するしかありません(できれば指摘してください.私はまだ見たことも書いた方法も分かりません).ポインタは、呼び出すときにシェルクラスオブジェクトを借りる必要があります.以上が呼び出し可能なオブジェクトです.