Rumah > Artikel > pembangunan bahagian belakang > Bolehkah fungsi C dibebankan berdasarkan semata-mata pada keteguhan hujah bukan penunjuk dan bukan rujukan?
Melebihi Pemuatan Fungsi dengan Argumen Konst
Dalam C , lebihan fungsi membolehkan kami mentakrifkan berbilang fungsi dengan nama yang sama tetapi dengan jenis hujah yang berbeza atau nombor. Walau bagaimanapun, terdapat pengehadan untuk lebihan muatan berdasarkan keteguhan hujah.
Pertimbangkan kod yang diberikan:
#include <iostream> using std::cout; class Test { public: Test() {} int foo(const int) const; int foo(int); }; int main() { Test obj; Test const obj1; int variable = 0; do { obj.foo(3); // Call the const function obj.foo(variable); // Attempt to call the non-const function variable++; usleep(2000000); } while (1); } int Test::foo(int a) { cout << "NON CONST" << std::endl; a++; return a; } int Test::foo(const int a) const { cout << "CONST" << std::endl; return a; }
Kod ini cuba melebihkan fungsi foo berdasarkan keteguhan hujah. Walau bagaimanapun, pengkompil menimbulkan ralat yang menyatakan bahawa fungsi tidak boleh terlebih beban.
Penjelasan
Dalam C , lebihan fungsi berdasarkan semata-mata pada keteguhan bukan penuding, hujah jenis bukan rujukan tidak dibenarkan. Ini kerana pengkompil tidak boleh membezakan antara kedua-dua fungsi berdasarkan keteguhan nilai yang dihantar oleh nilai.
Dalam kod yang diberikan, kedua-dua versi foo menerima integer mengikut nilai. Apabila hujah diluluskan oleh nilai, salinan pembolehubah dicipta dan keteguhan parameter formal tidak menjejaskan nilai salinan.
Oleh itu, pengkompil tidak mempunyai cara untuk menentukan versi mana foo untuk memanggil jika lulus integer bukan const mengikut nilai. Kekaburan ini melanggar larangan lebihan beban terhadap fungsi dengan tandatangan yang sama.
Pendekatan Alternatif
Untuk mencapai tingkah laku yang diingini, pendekatan alternatif boleh digunakan. Satu pilihan ialah menggunakan rujukan lulus dengan keteguhan eksplisit, seperti yang ditunjukkan di bawah:
int foo(const int& a); int foo(int& a);
Dengan pendekatan ini, pengkompil boleh membezakan antara dua fungsi berdasarkan keteguhan rujukan, membenarkan untuk terlebih muatan.
Atas ialah kandungan terperinci Bolehkah fungsi C dibebankan berdasarkan semata-mata pada keteguhan hujah bukan penunjuk dan bukan rujukan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!