Memahami Operator Penukaran dalam C
Pertimbangkan coretan kod berikut:
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 doesn't the compiler try substituting Type? }
Dalam C , operator penukaran bermain peranan penting dalam penukaran jenis. Jadi, bagaimana ia berfungsi?
1. Penukaran Semasa Menghantar Hujah:
Operator penukaran dipertimbangkan semasa menghantar hujah, mengikut peraturan permulaan salinan. Mereka menukar jenis sumber kepada mana-mana jenis yang serasi, tidak kira sama ada penukaran itu kepada rujukan atau tidak.
2. Penukaran kepada Rujukan:
Penukaran kepada rujukan dibenarkan dalam pengendali bersyarat jika jenis yang ditukar ialah lnilai. Selain itu, mengikat rujukan secara langsung juga mungkin melibatkan penukaran kepada rujukan.
3. Penukaran kepada Penunjuk Fungsi:
Penukaran yang ditentukan pengguna kepada penunjuk fungsi atau rujukan digunakan semasa membuat panggilan fungsi.
4. Penukaran kepada Jenis Bukan Kelas:
Penukaran tersirat, seperti kepada boolean, boleh menggunakan fungsi penukaran yang ditentukan pengguna.
5. Templat Fungsi Penukaran:
Templat boleh digunakan untuk mencipta fungsi penukaran yang menukar jenis kepada sebarang jenis penunjuk (kecuali penunjuk ahli).
Mengapa Pengkompil Tidak Jenis Pengganti?
Dalam contoh yang diberikan, pengkompil tidak menggantikan Jenis kerana pengendali penukaran dalam smartref mengembalikan penunjuk kepada ahli data dalaman. Apabila cuba memanggil think(), pengkompil membuat kesimpulan bahawa p ialah penunjuk kepada objek seseorang, bukan rujukan kepada objek seseorang. Oleh itu, ia tidak membuat sebarang penggantian jenis yang jelas.
Atas ialah kandungan terperinci Mengapa Jenis Pengganti Pengkompil tidak dalam Operator Penukaran?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!