Lepaskan Objek ke Pembina Sendiri dalam C
Sesetengah pengaturcara C telah menemui gelagat yang menarik: menghantar objek ke dalam pembinanya sendiri. Ini menimbulkan persoalan sama ada amalan sedemikian sah atau dianggap sebagai tingkah laku tidak ditentukan dalam C .
Pertimbangkan coretan kod berikut:
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main() { Foo foo(foo); // Surprisingly, this compiles and executes std::cout << &foo << std::endl; }
Dalam kod ini, pembina Foo menerima rujukan kepada objek yang dibina itu sendiri sebelum objek dimulakan sepenuhnya. Walaupun objek tidak dimulakan, kod itu dibenarkan oleh piawai C.
Seksyen 3.8 piawaian draf C 14 menjelaskan bahawa sebelum hayat objek bermula (atau selepas ia tamat), ia dibenarkan untuk mengambil alamatnya atau mengikat rujukan kepadanya selagi rujukan boleh mengikat secara langsung. Tingkah laku tidak ditentukan berlaku hanya apabila operasi tertentu, seperti penukaran lnilai kepada nilai, mengakses ahli data bukan statik atau pengikatan kelas asas maya, dilakukan pada objek yang dimulakan separa tersebut.
Contoh kod yang diberikan tidak melanggar mana-mana sekatan ini. Kami hanya mengikat rujukan dan mendapatkan alamat dalam pembina, yang dibenarkan.
Isu aktif 453, bagaimanapun, menimbulkan kebimbangan tentang kesahihan rujukan mengikat kepada objek yang tidak diinisialisasi. Bahasa cadangan awal menyokong Defect Report 363, yang membenarkan pengikatan seperti yang ditunjukkan dalam coretan kod.
Walaupun tingkah laku ini mungkin kelihatan ganjil pada mulanya, ia adalah hasil daripada pengkompil yang memperuntukkan ruang untuk objek sebelum pemulaan. Ini membenarkan operasi terhad, seperti pengikatan rujukan dan pengambilan alamat, tanpa menghasilkan nilai yang tidak tentu.
Atas ialah kandungan terperinci Bolehkah Anda Melewati Objek ke Pembinanya Sendiri dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!