Bilakah Pembina Salinan Ditakrifkan Pengguna Diperlukan?
Dalam C , pengkompil secara automatik menjana pembina salinan lalai yang melaksanakan dari segi ahli meniru. Walau bagaimanapun, pembina lalai ini mungkin tidak selalu memberikan tingkah laku yang diingini. Apabila pembina salinan diperlukan, pengaturcara mesti menulis versi yang ditentukan pengguna yang menentukan tingkah laku khusus untuk menyalin objek.
Situasi yang memerlukan pembina salinan yang ditentukan pengguna termasuk:
Penyalinan Dalam: Apabila objek mempunyai ahli yang menjadi penunjuk kepada memori yang diperuntukkan secara dinamik, pembina salinan lalai hanya menyalin nilai penunjuk, bukan data sebenar. Untuk memastikan salinan yang mengandungi data bebas, pembina salinan yang ditentukan pengguna mesti dilaksanakan untuk melaksanakan penyalinan dalam.
Contoh:
<code class="cpp">class Class { public: Class(const char* str); ~Class(); private: char* stored; }; Class::Class(const char* str) { stored = new char[strlen(str) + 1]; strcpy(stored, str); } Class::~Class() { delete[] stored; }</code>
Dalam contoh ini, pembina salinan lalai hanya akan menyalin penunjuk yang disimpan, menghasilkan dua salinan menunjuk ke memori yang diperuntukkan secara dinamik yang sama. Untuk memastikan penyalinan selamat, pembina salinan yang ditentukan pengguna yang memperuntukkan memori baharu dan menyalin data adalah perlu.
Peruntukan Sumber: Apabila pembina kelas memperuntukkan sumber yang perlu dikongsi atau diuruskan secara eksplisit, pembina salinan yang ditentukan pengguna boleh mengawal peruntukan dan pelepasan sumber ini. Ini membantu mengelakkan kebocoran memori dan memastikan pengendalian sumber kongsi yang betul.
Pengendalian Pengecualian: Pembina salinan boleh digunakan untuk mengendalikan pengecualian yang mungkin berlaku semasa proses penyalinan. Dalam kes di mana pengecualian mungkin berlaku semasa penyalinan, pembina salinan yang ditentukan pengguna boleh menangani situasi sedemikian secara eksplisit.
Contoh:
<code class="cpp">class Class { public: Class(const Class& other) try : shared_resource(other.shared_resource) {} catch (...) {} private: std::shared_ptr<Resource> shared_resource; };</code>
Dalam contoh ini , pembina salinan cuba berkongsi sumber yang sama dengan objek asal. Jika pengecualian berlaku semasa pemerolehan sumber, objek baharu dibiarkan tanpa dimulakan, mengurangkan risiko operasi yang tidak betul.
Atas ialah kandungan terperinci Bilakah Pembina Salinan Ditakrifkan Pengguna Diperlukan dalam C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!