Dalam pengaturcaraan berorientasikan objek, memanggil fungsi ahli melalui penunjuk kelas adalah amalan biasa. Walau bagaimanapun, pengendalian situasi di mana penunjuk kelas boleh ditetapkan kepada nilai NULL memerlukan pertimbangan yang teliti.
Pertimbangkan coretan kod berikut:
class ABC { public: int a; void print() { cout << "hello" << endl; } }; int main() { ABC *ptr = NULL; ptr->print(); return 0; }
Dalam contoh ini, ptr penunjuk jenis ABC* ialah dimulakan kepada NULL. Selepas itu, fungsi print() digunakan melalui ptr penunjuk. Secara intuitif, operasi ini akan mencetuskan ralat atau pengecualian, kerana ptr tidak menunjuk kepada objek ABC yang sah.
Walau bagaimanapun, yang menghairankan, kod ini diperhatikan berjalan dengan jayanya. Bagaimanakah ini boleh berlaku?
Kelakuan Tidak Ditakrifkan dan Mengakses Memori Tidak Wujud
Memanggil fungsi ahli menggunakan penuding yang tidak menghala ke objek yang sah mengakibatkan tingkah laku yang tidak ditentukan. Ini bermakna secara teorinya, apa-apa sahaja boleh berlaku—daripada ranap sistem hingga program berjalan seperti yang dijangkakan.
Dalam kes khusus ini, fungsi print() tidak menggunakan penuding ini, yang menunjuk kepada contoh objek. Oleh itu, fungsi boleh melaksanakan secara bebas sama ada ptr menunjuk ke objek yang sah atau tidak. Ini menerangkan sebab program nampaknya berjaya dijalankan walaupun terdapat operasi penunjuk yang berpotensi berbahaya.
Peringatan Awas
Adalah penting untuk diingat bahawa mengakses lokasi memori yang tidak wujud melalui nol petunjuk penuh dengan akibat yang tidak dijangka. Walaupun ia mungkin berkesan dalam beberapa keadaan, bergantung pada tingkah laku sedemikian boleh membawa kepada pepijat halus dan hasil yang tidak dapat diramalkan.
Oleh itu, berhati-hati harus dilaksanakan apabila menggunakan penunjuk kelas nol dan semakan yang betul harus dilaksanakan untuk memastikan sah tika objek diakses.
Atas ialah kandungan terperinci Mengapa Memanggil Ahli Berfungsi Melalui Penunjuk Kelas NULL Kadangkala Berfungsi?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!