Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bolehkah fungsi C dibebankan berdasarkan semata-mata pada keteguhan hujah bukan penunjuk dan bukan rujukan?

Bolehkah fungsi C dibebankan berdasarkan semata-mata pada keteguhan hujah bukan penunjuk dan bukan rujukan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-11 19:35:03190semak imbas

Can C   functions be overloaded based solely on the constness of a non-pointer, non-reference argument?

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!

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