Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bilakah Pengkompil Menggantikan `Jenis&` dalam Operator Penukaran C?

Bilakah Pengkompil Menggantikan `Jenis&` dalam Operator Penukaran C?

DDD
DDDasal
2024-11-16 05:11:02330semak imbas

When Does the Compiler Substitute `Type&` in C   Conversion Operators?

Memahami Operator Penukaran dalam C

Dalam bidang pengaturcaraan berorientasikan objek, pengendali penukaran memainkan peranan penting dalam merapatkan jurang antara berbeza jenis data. Pengendali ini membenarkan objek dianggap sebagai jenis lain, meluaskan kebolehgunaannya.

Pertimbangkan contoh berikut untuk menggambarkan cara pengendali penukaran berfungsi:

template <class Type>
class smartref {
public:
    smartref() : data(new Type) { }
    operator Type&() { return *data; }
private:
    Type* data;
};

class person {
public:
    void think() { std::cout << "I am thinking"; }
};

int main() {
    smartref<person> p;
    p.think(); // why does not the compiler try substituting Type&?
}

Dalam contoh ini, kelas smartref ialah ditakrifkan sebagai kelas templat, yang boleh menyimpan contoh dari sebarang jenis Jenis. Operator penukaran Type&() dilaksanakan untuk menghantar objek smartref ke rujukan Type yang mendasari.

Apabila Pengkompil Menggantikan Jenis&

Pengkompil akan menggantikan Type& dalam pengendali penukaran di bawah keadaan berikut:

  • Hujah Lulus: Apabila objek dihantar sebagai argumen kepada fungsi, pengkompil boleh menggantikan Jenis& jika fungsi menerima rujukan kepada Jenis.
  • Pengikatan Rujukan: Apabila rujukan adalah terikat secara langsung pada objek, pengkompil boleh menggantikan Type& jika objek itu adalah lvalue.
  • Penukaran Penunjuk Fungsi: Apabila objek ditukar kepada penunjuk fungsi atau rujukan, pengkompil boleh menggantikan Jenis& jika penunjuk fungsi atau rujukan sepadan dengan tandatangan fungsi penukaran.
  • Penukaran Jenis Bukan Kelas: Pengkompil boleh menggunakan fungsi penukaran yang ditakrifkan pengguna untuk menukar objek kepada jenis bukan kelas, seperti nilai bool atau penunjuk.
  • Operator Penukaran Templat: Operator penukaran templat membenarkan objek boleh ditukar kepada sebarang jenis penunjuk. Walau bagaimanapun, berhati-hati dinasihatkan apabila menggunakan pengendali ini kerana ia boleh membawa kepada kekaburan.

Dalam kes contoh yang diberikan, pengkompil tidak menggantikan Type& dalam panggilan fungsi think() kerana ia dipanggil pada objek jenis smartref, yang bukan rujukan lnilai kepada Jenis&.

Atas ialah kandungan terperinci Bilakah Pengkompil Menggantikan `Jenis&` dalam Operator Penukaran 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