Aturan Tiga/Lima
Kelola penyalinan dan pemindahan dengan benar
Aturan Tiga/Lima adalah pelajaran C++ Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C++ Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C++ Academy mencakup 4 pelajaran total.
Aturan Tiga
Jika sebuah kelas memerlukan destruktor khusus, hampir selalu kelas tersebut juga memerlukan konstruktor penyalinan dan penugasan penyalinan khusus. Ketiganya selalu berjalan bersama.
Mengapa Tiga?
Kelas yang mengelola sumber daya mentah harus mendefinisikan cara sumber daya tersebut dihancurkan, disalin, dan ditugaskan—jika tidak, penyalinan dangkal yang dibuat kompiler akan menyebabkan pembebasan ganda.
#include <iostream>
class Bad {
int* p;
public:
Bad(int v) : p(new int(v)) {}
~Bad() { delete p; }
// default copy => two objects delete the same p!
};Konstruktor Salin Khusus
Konstruktor salin yang benar melakukan penyalinan mendalam, dengan mengalokasikan sumber dayanya sendiri alih-alih berbagi.
#include <iostream>
class Box {
int* p;
public:
Box(int v) : p(new int(v)) {}
Box(const Box& o) : p(new int(*o.p)) {} // deep copy
~Box() { delete p; }
int get() const { return *p; }
};
int main() {
Box a(5);
Box b = a; // independent copy
std::cout << b.get() << "\n";
}Penugasan Salin Khusus
Penugasan salin harus membebaskan sumber daya lama, mencegah penugasan ke diri sendiri, dan menyalin nilai baru secara mendalam.
Box& operator=(const Box& o) {
if (this != &o) { // self-assignment guard
delete p;
p = new int(*o.p);
}
return *this;
}Aturan Lima
C++11 menambahkan operasi pemindahan. Jika Anda mendefinisikan salah satu dari lima operasi tersebut (destruktor, konstruktor salin, penugasan salin, konstruktor pemindahan, penugasan pemindahan), pertimbangkan untuk mendefinisikan kelimanya.
Konstruktor Pemindahan
Konstruktor pemindahan mengambil alih sumber daya dari objek sementara dan membiarkan sumbernya kosong—jauh lebih murah daripada menyalin.
Box(Box&& o) noexcept : p(o.p) {
o.p = nullptr; // source left empty
}Penugasan Pemindahan
Penugasan pemindahan melepaskan sumber daya saat ini, lalu mengambil kepemilikan sumber daya milik sumber.
Box& operator=(Box&& o) noexcept {
if (this != &o) {
delete p;
p = o.p;
o.p = nullptr;
}
return *this;
}Tandai Pemindahan sebagai noexcept
Operasi pemindahan sebaiknya noexcept agar wadah seperti std::vector dapat menggunakannya dengan aman saat melakukan realokasi.
Aturan Nol
Yang terbaik: jangan memiliki sumber daya mentah. Gunakan std::unique_ptr, std::vector, atau std::string, sehingga Anda tidak perlu mendefinisikan satu pun dari kelima operasi tersebut—nilai bawaan dari kompiler sudah benar.
#include <memory>
class Good {
std::unique_ptr<int> p; // owns the resource for you
public:
Good(int v) : p(std::make_unique<int>(v)) {}
// no destructor, no copy/move needed
};Menghapus Operasi
Jika penyalinan tidak masuk akal, hapus operasi tersebut: Box(const Box&) = delete;. Dengan demikian, jenis tersebut sengaja hanya dapat dipindahkan atau tidak dapat disalin.
Memilih Aturan yang Tepat
Usahakan mengikuti Aturan Nol. Gunakan Aturan Lima sebagai pilihan cadangan hanya ketika Anda benar-benar membungkus sumber daya mentah yang tidak dicakup oleh pustaka standar.
Pemeriksaan Cepat
Uji pemahaman Anda tentang Aturan Tiga/Lima.
Ringkasan
Anda telah mempelajari Aturan Tiga/Lima: mengelola sumber daya mentah berarti mendefinisikan operasi destruksi, penyalinan, dan pemindahan secara konsisten. Tandai operasi pemindahan sebagai noexcept. Yang terbaik, ikuti Aturan Nol dengan menggunakan jenis RAII standar dan tidak mendefinisikan satu pun operasi tersebut.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Aturan Tiga/Lima” gratis?
Ya — teks lengkap “Aturan Tiga/Lima” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C++ Academy, upgrade ke CoddyKit PRO. Kursus C++ Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Aturan Tiga/Lima”?
Kelola penyalinan dan pemindahan dengan benar Kamu berlatih C++ Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C++ Academy?
Tidak diperlukan pengalaman sebelumnya. C++ Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “Aturan Tiga/Lima” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C++ Academy ini?
Ya. Setiap pelajaran C++ Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Prinsip RAII
- Destruktor dan Pembersihan
- Aturan Tiga/Lima
- Guard Scope