Mencipta Fungsi Bersama untuk Pembina Salin dan Operator Tugasan
Pembina salinan dan operator tugasan yang berlebihan sering berkongsi kod yang serupa dan hanya berbeza dalam jenis pulangan mereka. Bolehkah kita memudahkan perkara ini dengan mencipta fungsi biasa yang boleh digunakan oleh kedua-duanya?
Pilihan 1: Operator Memanggil Secara Eksplisit= daripada Copy Constructor
MyClass(const MyClass& other) { operator=(other); }
Pendekatan ini secara amnya tidak digalakkan kerana ia memperkenalkan masalah dengan pengurusan negeri lama dan penugasan diri. Selain itu, ia menginisialisasikan semua ahli secara lalai, walaupun mereka diperuntukkan daripada objek lain.
Pilihan 2: Melaksanakan Operator= Menggunakan Copy Constructor dan Swap
Sebuah pilihan penyelesaian melibatkan pelaksanaan operator= menggunakan pembina salinan dan kaedah swap:
MyClass& operator=(const MyClass& other) { MyClass tmp(other); swap(tmp); return *this; }
Atau malah:
MyClass& operator=(MyClass other) { swap(other); return *this; }
Fungsi swap menukar pemilikan data dalaman tanpa membersihkan keadaan sedia ada atau memperuntukkan sumber baharu. Pendekatan ini adalah selamat untuk penugasan kendiri dan sangat selamat dikecualikan, dengan syarat bahawa operasi swap adalah tanpa balingan.
Awas:
Pastikan kaedah swap berfungsi dengan benar swap, bukan std::swap lalai, yang bergantung pada pembina salinan dan pengendali tugasan itu sendiri. Gunakan pertukaran ahli untuk jenis primitif dan jenis penunjuk untuk menjamin kelakuan tidak membuang.
Atas ialah kandungan terperinci Bolehkah Fungsi Biasa Memudahkan Pembina Salin dan Operator Tugasan Lebihan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!