首頁  >  文章  >  後端開發  >  C++ 中函數指標與函式物件的異同?

C++ 中函數指標與函式物件的異同?

王林
王林原創
2024-04-12 13:18:02484瀏覽

函數指標和函數物件都是處理函數作為資料的機制。函數指針是指向函數的指針,而函數物件是包含重載的 operator() 的物件。兩者都可以捕獲變數並創建閉包。不同之處在於,函數指標是原始類型,而函數物件是類別;函數指標必須指向有效函數,否則會產生未定義行為,而函數物件可以脫離其創建的函數而存在;函數物件通常比函數指標更易用。在實戰場景中,可以在排序演算法中使用它們來指定排序規則。

C++ 中函数指针与函数对象的异同?

C 中函數指標與函數物件的異同

#在C 中,函數指標與函數物件是兩種不同的機制,用於處理函數作為數據的場景。雖然它們有相似之處,但也有一些關鍵的區別。

函數指標

  • #指向函數的指標。
  • 儲存函數的位址。
  • 語法:returnType (*functionPtr)(arguments)

範例:

int add(int a, int b) { return a + b; }

int main() {
  // 声明一个指向 add 函数的函数指针
  int (*funcPtr)(int, int) = add;

  // 通过函数指针调用 add 函数
  int result = funcPtr(5, 10);

  return 0;
}

#函數物件

  • 可以被呼叫的物件。
  • 包含一個重載的 operator(),就像函數一樣。
  • 語法:class Foo { ... }; Foo funcObj;

#範例:

class Adder {
public:
  int operator()(int a, int b) { return a + b; }
};

int main() {
  // 创建一个 Adder 函数对象
  Adder adder;

  // 通过函数对象调用 add 函数
  int result = adder(5, 10);

  return 0;
}

異同

異同點:

  • #功能:函數指標和函數物件都允許將函數作為資料傳遞。
  • 語法:兩者都可以捕獲變數並建立閉包。

不同點:

  • 類型:函數指標是原始類型,而函數物件是類別。
  • 生命週期:函數指標必須指向有效函數,否則會產生未定義行為。函數物件可以脫離其創建的函數而存在。
  • 易用性:使用函數物件通常比函數指標更方便,因為它更接近函數的自然語法。

實戰案例

在一個需要將函數作為參數傳遞的排序演算法中,可以使用函數指標或函數物件來指定排序規則。例如,使用函數指標:

int compareAsc(int a, int b) { return a - b; }

void sort(int *arr, int n, int (*compareFunc)(int, int)) {
  ...
}

使用函數物件:

struct AscendingComparator { bool operator()(int a, int b) { return a < b; } };

void sort(int *arr, int n, std::function<bool(int, int)> compareFunc) {
  ...
}

#結論

函數指標和函數物件為C 中處理函數作為資料提供了不同的機制。函數指標具有較低的開銷,但需要小心管理函數生命週期。函數物件較易用,但開銷略高。選擇哪種方法取決於特定要求。

以上是C++ 中函數指標與函式物件的異同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn