Melalukan Objek C ke dalam Pembinanya Sendiri
Dalam C , ia mungkin kelihatan berlawanan dengan intuisi tetapi sememangnya sah untuk menghantar objek C ke dalam pembina sendiri. Pertimbangkan coretan kod berikut:
#include <iostream> struct Foo { Foo(Foo& bar) { std::cout << &bar << std::endl; } }; int main(int argc, char** argv) { Foo foo(foo); // Surprising, yet valid std::cout << &foo << std::endl; }
Dalam contoh ini, kami menghantar alamat objek Foo yang dibina (&foo) ke dalam pembinanya sendiri. Ini mungkin menyerupai definisi bulat, tetapi ia tidak dianggap kelakuan tidak ditentukan oleh piawaian C.
Penjelasan
Standard membenarkan kami menggunakan objek yang tidak dimulakan dengan cara yang terhad sebelum permulaan penuh mereka. Khususnya, mengikat rujukan kepadanya atau mengambil alamatnya adalah dibenarkan. Ini ditakrifkan dalam laporan kecacatan 363 dan seksyen 3.8 draf standard C 14.
Ini bermakna dalam kod di atas, kami tidak melanggar sebarang kekangan yang ditetapkan oleh bahasa tersebut. Kami hanya menggunakan objek foo yang tidak dimulakan dalam pembina dengan cara yang mematuhi piawai.
Amaran Clang
Walau bagaimanapun, perlu diperhatikan bahawa sesetengah penyusun seperti Clang mungkin mengeluarkan amaran tentang pembolehubah yang tidak dimulakan. Ini kerana menghasilkan nilai tidak tentu daripada pembolehubah automatik yang tidak dimulakan secara amnya dianggap sebagai tingkah laku tidak ditentukan. Walau bagaimanapun, dalam kes ini, kami tidak memperkenalkan ketidakpastian kerana kami hanya mengikat rujukan dan mengambil alamat dalam pembina.
Batasan
Adalah penting untuk ditekankan walaupun tingkah laku ini dibenarkan oleh standard, ia tidak boleh dianggap sebagai amalan yang baik atau mempunyai sebarang kes penggunaan praktikal. Niat utama perbincangan ini adalah untuk menjelaskan aspek semantik bahasa C yang kurang dikenali.
Atas ialah kandungan terperinci Bolehkah Anda Melewati Objek C ke Pembinanya Sendiri?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!