Üçlü/Beşli Kural
Kopyalama ve taşımayı doğru yönetin
Üçlü/Beşli Kural, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, C++ Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. C++ Academy kursu toplamda 4 dersten oluşur.
Üç Kuralı
Bir sınıfın özel bir yıkıcıya ihtiyacı varsa neredeyse her zaman özel bir kopya kurucusuna ve kopya atamasına da ihtiyacı vardır. Bu üçü birlikte ele alınır.
Neden Üç
Ham bir kaynağı yöneten sınıf, kaynağın nasıl yok edileceğini, kopyalanacağını ve atanacağını tanımlamalıdır; aksi takdirde derleyicinin oluşturduğu sığ kopyalar çift serbest bırakmaya neden olur.
#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!
};Özel Kopya Kurucusu
Doğru bir kopya kurucusu, kaynağı paylaşmak yerine kendi kaynağını ayırarak derin kopyalama gerçekleştirir.
#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";
}Özel Kopya Ataması
Kopya ataması eski kaynağı serbest bırakmalı, kendine atamaya karşı korunmalı ve yeni değeri derinlemesine kopyalamalıdır.
Box& operator=(const Box& o) {
if (this != &o) { // self-assignment guard
delete p;
p = new int(*o.p);
}
return *this;
}Beş Kuralı
C++11, taşıma işlemlerini ekler. Beş işlemden herhangi birini (yıkıcı, kopya kurucusu, kopya ataması, taşıma kurucusu, taşıma ataması) tanımlarsanız hepsini tanımlamayı düşünün.
Taşıma Kurucusu
Bir taşıma kurucusu, kaynağı geçici bir nesneden devralır ve kaynak nesneyi boş bırakır; bu, kopyalamaktan çok daha ucuzdur.
Box(Box&& o) noexcept : p(o.p) {
o.p = nullptr; // source left empty
}Taşıma Ataması
Taşıma ataması mevcut kaynağı serbest bırakır, ardından kaynak nesnenin kaynağının sahipliğini devralır.
Box& operator=(Box&& o) noexcept {
if (this != &o) {
delete p;
p = o.p;
o.p = nullptr;
}
return *this;
}Taşımaları noexcept Olarak İşaretleme
Taşıma işlemleri noexcept olmalıdır; böylece std::vector gibi kapsayıcılar yeniden boyutlandırma sırasında bunları güvenle kullanabilir.
Sıfır Kuralı
En iyisi, ham hiçbir kaynağın sahibi olmamaktır. std::unique_ptr, std::vector veya std::string kullanırsanız beş işlemin hiçbirini tanımlamanız gerekmez; derleyicinin varsayılanları doğrudur.
#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
};İşlemleri Silme
Kopyalamanın anlamlı olmadığı durumlarda onu silin: Box(const Box&) = delete;. Böylece türü bilinçli olarak yalnızca taşınabilir veya kopyalanamaz hâle getirirsiniz.
Doğru Kuralı Seçme
Sıfır Kuralı'nı hedefleyin. Beş Kuralı'na yalnızca standart kitaplığın kapsamadığı ham bir kaynağı gerçekten sarmaladığınızda başvurun.
Hızlı Kontrol
Üç/Beş Kuralı konusundaki anlayışınızı sınayın.
Özet
Üç/Beş Kuralı'nı öğrendiniz: ham bir kaynağı yönetmek, yıkıcıyı, kopyalama ve taşıma işlemlerini tutarlı biçimde tanımlamayı gerektirir. Taşımaları noexcept olarak işaretleyin. En iyisi, standart RAII türlerini kullanarak ve hiçbirini tanımlamayarak Sıfır Kuralı'nı uygulamaktır.
Sıkça Sorulan Sorular
“Üçlü/Beşli Kural” dersi ücretsiz mi?
Evet — “Üçlü/Beşli Kural” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve C++ Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. C++ Academy kursu toplamda 4 dersten oluşur.
“Üçlü/Beşli Kural” dersinde ne öğreneceğim?
Kopyalama ve taşımayı doğru yönetin C++ Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
C++ Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te C++ Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.
“Üçlü/Beşli Kural” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu C++ Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her C++ Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- RAII İlkesi
- Yıkıcılar ve Temizleme
- Üçlü/Beşli Kural
- Kapsam Koruyucuları