Bolehkah Satu Fungsi Mengendalikan Kedua-dua Pembina Salin dan Operator Tugasan Salin?
Dalam pengaturcaraan berorientasikan objek, kelas selalunya memerlukan pembina salinan dan pengendali tugasan salinan untuk memastikan penyalinan objek yang betul. Walaupun fungsi ini berkongsi banyak persamaan, ia mempunyai jenis pulangan yang berbeza. Ini menimbulkan persoalan: bolehkah fungsi biasa digunakan untuk mengendalikan kedua-dua pembina salinan dan pengendali tugasan salinan?
Pendekatan Pelaksanaan
Ya, terdapat dua kaedah utama untuk mencapai ini:
1. Memanggil Operator Tugasan Salin daripada Pembina Salin (Tidak Digalakkan)
MyClass(const MyClass& other) { operator=(other); }
Pendekatan ini secara amnya tidak digalakkan kerana ia memperkenalkan kerumitan tambahan dan potensi isu yang berkaitan dengan tugasan sendiri dan pengendalian keadaan sedia ada yang betul.
2. Copy-and-Swap Idiom
Pendekatan yang lebih disyorkan ialah copy-and-swap idiom:
MyClass& operator=(const MyClass& other) { MyClass tmp(other); swap(tmp); return *this; }
Idiom ini melibatkan mencipta objek sementara, menyalin keadaan yang dikehendaki ke dalam itu, dan kemudian menukar bahagian dalam dengan objek semasa. Pendekatan ini memberikan beberapa kelebihan:
Nota: Ia adalah penting untuk memastikan bahawa fungsi swap melakukan swap sebenar dan bukan std::swap lalai, yang akan bergantung pada pembina salinan dan pengendali tugasan.
Kesimpulan
Walaupun pembina salinan dan operator tugasan salinan mempunyai jenis pemulangan yang berbeza, adalah mungkin untuk menggunakan fungsi biasa untuk mengendalikan kedua-duanya melalui simpulan bahasa salin-dan-tukar. Pendekatan ini memudahkan pelaksanaan, memastikan keselamatan penugasan sendiri dan memberikan jaminan pengecualian yang kukuh.
Atas ialah kandungan terperinci Bolehkah Fungsi Tunggal Mengendalikan Kedua-dua Pembinaan C Salin dan Tugasan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!