ホームページ >バックエンド開発 >C++ >C++ 関数ポインターを使用して関数を渡したり呼び出したりするにはどうすればよいですか?

C++ 関数ポインターを使用して関数を渡したり呼び出したりするにはどうすればよいですか?

王林
王林オリジナル
2024-04-17 16:36:01956ブラウズ

関数ポインターを使用すると、関数をパラメーターとして渡すことができるため、関数呼び出しがより柔軟になります。関数ポインターを宣言し、パラメーターを渡し、ポインター演算子を介して指定された関数を呼び出します。動的なスケジューリングや並べ替えアルゴリズムの選択などの高度な機能は、関数ポインターを介して実装できます。

如何使用 C++ 函数指针传递和调用函数?

C 関数ポインタを使用して関数を渡したり呼び出したりする方法

関数ポインタは、次の場所を指す特殊なタイプのポインタです。機能 。関数ポインターを使用すると、関数をパラメーターとして他の関数に渡すことができ、より高レベルの関数呼び出しが可能になります。

関数ポインタの宣言と初期化

関数ポインタを宣言するには、関数の戻り値の型とパラメータの型を指定する必要があります:

int (*func_ptr)(int, int);

上記のコードは、2 つの整数を受け取り、1 つの整数を返す関数を指す関数ポインター func_ptr を宣言します。

関数ポインターを初期化するには、関数名または関数ポインターを使用できます。

func_ptr = my_function;  // 使用函数名
func_ptr = &my_function; // 使用函数指针

ここで、my_function は、対応するシグネチャを持つ関数です。

関数ポインタを渡す

関数ポインタをパラメータとして他の関数に渡すことができます。

void call_function(int (*func)(int, int)) {
    int result = func(1, 2);
    // ...
}

上記の関数 call_function は、次の関数を受け取ります。関数ポインター func。2 つの整数を受け取り、整数を返す関数を指します。

関数ポインターの呼び出し

関数ポインターが指す関数を呼び出すには、ポインター演算子 (*) を使用する必要があります。

int result = (*func_ptr)(1, 2);  // 调用通过 func_ptr 指向的函数

実用的なケース

関数ポインタを使用して配列を並べ替える次の例を考えてみましょう:

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

int compare(int a, int b) {
    return a > b;
}

bool greater_than(int a, int b) {
    return a > b;
}

int main() {
    vector<int> arr = {1, 4, 2, 8, 5};

    // 使用函数指针 compare 降序排序
    sort(arr.begin(), arr.end(), compare);

    // 使用 lambda 表达式升序排序
    sort(arr.begin(), arr.end(), [](int a, int b) {
        return a < b;
    });

    // 使用 std::greater 升序排序
    sort(arr.begin(), arr.end(), greater<int>());

    for (int i = 0; i < arr.size(); i++) {
        cout << arr[i] << " ";
    }

    return 0;
}

上の例では、3 つの比較関数を定義しました。 :

  • compare: 降順比較関数
  • greater_than: 昇順比較関数 (関数ポインタを使用)
  • [ ](int a, int b) { return a < b; }:昇順比較関数(ラムダ式を使用)

Functionsort は、関数ポインタを引数として使用し、指定された比較関数に従って配列を並べ替えます。この例では、関数ポインターを使用して、異なる並べ替えアルゴリズムを簡単に切り替える方法を示します。

以上がC++ 関数ポインターを使用して関数を渡したり呼び出したりするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。