Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Apakah persamaan dan perbezaan antara penunjuk fungsi dan objek fungsi dalam C++?

Apakah persamaan dan perbezaan antara penunjuk fungsi dan objek fungsi dalam C++?

王林
王林asal
2024-04-12 13:18:02535semak imbas

Penunjuk fungsi dan objek fungsi ialah kedua-dua mekanisme untuk mengendalikan fungsi sebagai data. Penunjuk fungsi ialah penuding kepada fungsi, manakala objek fungsi ialah objek yang mengandungi operator terlampau beban(). Kedua-duanya boleh menangkap pembolehubah dan membuat penutupan. Perbezaannya ialah penunjuk fungsi adalah jenis primitif, manakala objek fungsi ialah kelas penunjuk fungsi mesti menunjuk kepada fungsi yang sah, jika tidak, tingkah laku yang tidak ditentukan akan berlaku, manakala objek fungsi boleh wujud secara bebas daripada fungsi objek fungsi biasanya lebih mudah untuk digunakan dapatkan semula daripada penggunaan penunjuk fungsi. Dalam senario praktikal, ia boleh digunakan untuk menentukan peraturan pengisihan dalam algoritma pengisihan.

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

Persamaan dan perbezaan antara penunjuk fungsi dan objek fungsi dalam C++

Dalam C++, penunjuk fungsi dan objek fungsi ialah dua mekanisme berbeza, digunakan untuk mengendalikan senario di mana fungsi digunakan sebagai data. Walaupun mereka mempunyai persamaan, terdapat juga beberapa perbezaan utama.

Penunjuk fungsi

  • Penunjuk kepada fungsi.
  • Simpan alamat fungsi.
  • Sintaks: returnType (*functionPtr)(argumen)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;

Contoh:

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;
}

Objek fungsi

Sebuah objek yang boleh dipanggil Mengandungi operator terbeban(), sama seperti fungsi.

    Sintaks: kelas Foo { ... }; Foo funcObj;
  • Contoh:
  • int compareAsc(int a, int b) { return a - b; }
    
    void sort(int *arr, int n, int (*compareFunc)(int, int)) {
      ...
    }
  • Persamaan dan Perbezaan

  • Fungsi : Fungsi Kedua-dua penunjuk dan objek fungsi membenarkan fungsi dihantar sebagai data.
  • Sintaks: Kedua-duanya boleh menangkap pembolehubah dan membuat penutupan.
  • Perbezaan:

Jenis:

Penunjuk fungsi ialah jenis primitif, manakala objek fungsi ialah kelas.

Kitaran hayat:

Penuding fungsi mesti menunjuk kepada fungsi yang sah, jika tidak, tingkah laku yang tidak ditentukan akan berlaku. Objek fungsi boleh wujud secara bebas daripada fungsi ia dicipta.

Kemudahan penggunaan:

Menggunakan objek fungsi selalunya lebih mudah daripada penunjuk fungsi kerana ia lebih dekat dengan sintaks semula jadi fungsi.

🎜🎜Kes praktikal🎜🎜🎜Dalam algoritma pengisihan yang memerlukan lulus fungsi sebagai parameter, anda boleh menggunakan penunjuk fungsi atau objek fungsi untuk menentukan peraturan pengisihan. Contohnya, menggunakan penunjuk fungsi: 🎜
struct AscendingComparator { bool operator()(int a, int b) { return a < b; } };

void sort(int *arr, int n, std::function<bool(int, int)> compareFunc) {
  ...
}
🎜 Menggunakan objek fungsi: 🎜rrreee🎜🎜Kesimpulan🎜🎜🎜Penunjuk fungsi dan objek fungsi menyediakan mekanisme yang berbeza untuk mengendalikan fungsi sebagai data dalam C++. Penunjuk fungsi mempunyai overhed yang lebih rendah, tetapi memerlukan pengurusan yang teliti sepanjang hayat fungsi. Objek fungsi lebih mudah digunakan, tetapi mempunyai overhed yang lebih tinggi sedikit. Kaedah mana yang hendak dipilih bergantung pada keperluan khusus. 🎜

Atas ialah kandungan terperinci Apakah persamaan dan perbezaan antara penunjuk fungsi dan objek fungsi dalam C++?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn