Rumah >pembangunan bahagian belakang >C++ >Bolehkah Fungsi Biasa Memudahkan Pembina Salin dan Operator Tugasan Lebihan?

Bolehkah Fungsi Biasa Memudahkan Pembina Salin dan Operator Tugasan Lebihan?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-11-27 03:15:12470semak imbas

Can a Common Function Simplify Copy Constructor and Assignment Operator Overloads?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn