Dalam C Primer Edisi Ke-5, perbezaan berikut dibuat:
int f(int){ /* can write to parameter */} int f(const int){ /* cannot write to parameter */}
Sementara kedua-duanya fungsi kelihatan tidak dapat dibezakan, mereka sememangnya berbeza dalam keupayaan mereka untuk mengemas kini parameter mereka. Walau bagaimanapun, ia tetap boleh dibezakan dalam tandatangan fungsinya.
Sebab bagi ketidakbezaan ini terletak pada sifat "laluan mengikut nilai" bagi parameter berasaskan nilai. Apabila objek dihantar ke fungsi, salinan dicipta, yang merupakan parameter sebenar yang diubah suai dalam fungsi. Kelayakan const di peringkat atas tidak menjejaskan nilai salinan, kerana salinan itu bukan const const. Oleh itu, dari perspektif pemanggil, kedua-dua fungsi mempunyai kesan yang sama.
Lebih muatan fungsi adalah berdasarkan parameter yang disediakan oleh pemanggil. Ketetapan parameter tidak mengubah fungsi yang disediakan oleh fungsi yang dipanggil, jadi tidak masuk akal untuk mengubah pelaksanaan berdasarkannya. Pertimbangkan kod berikut:
f(3); int x = 1 + 2; f(x);
Fungsi f() dijangka berkelakuan sama dalam kedua-dua kes, dengan atau tanpa kelayakan const. Menyediakan pelaksanaan yang berbeza boleh menyebabkan kekeliruan dan ralat.
Berbeza dengan parameter berasaskan nilai, rujukan melalui rujukan kepada objek sebenar, bukan salinan. Ini membolehkan kedua-dua lebihan beban berdasarkan keteguhan rujukan dan meneruskan ketabahan melalui panggilan fungsi. Contohnya:
const T& f(const F&); T& f(F&);
Di sini, pelaksanaan boleh berbeza-beza bergantung pada sama ada parameter diluluskan oleh rujukan const atau rujukan bukan const.
Walaupun kekurangan perbezaan dalam tandatangan fungsi, terdapat cara untuk meniru tingkah laku yang diingini dengan menggunakan const rujukan:
T f(F& x_ref) { F x = x_ref; // or const F if you won't modify it ...use x for safety... }
Dengan menghantar parameter sebagai rujukan const, pengkompil akan melarang sebarang pengubahsuaian pada parameter. Ini memastikan keselamatan sambil menyediakan antara muka yang serupa.
Atas ialah kandungan terperinci Mengapa C tidak membezakan antara parameter `const` dan bukan `const` dalam tandatangan fungsi untuk jenis nilai?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!