Taşıma Yapıcıları ve Taşıma Ataması
Taşıma yapıcılarını ve taşıma atama operatörlerini doğru şekilde uygulayın
Taşıma Yapıcıları ve Taşıma Ataması, CoddyKit'te ücretsiz bir C++ Academy dersidir. Bu, 4 dersinin 4. 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.
İki Özel Üye
Taşıma kurucusu ve taşıma atama işleci, sınıfınızın başka bir örneğin kaynaklarının sahipliğini kopyalama yapmadan almasını sağlar.
İmza
İkisi de aynı tür için bir rvalue referansı alır.
class String {
public:
String(String&& other) noexcept; // move ctor
String& operator=(String&& other) noexcept; // move assign
};Taşıma Kurucusunu Uygulama
Kaynak nesnenin kaynaklarını alın ve onu geçerli, boş bir durumda bırakın.
String(String&& other) noexcept
: data_(other.data_), size_(other.size_) {
other.data_ = nullptr;
other.size_ = 0;
}Taşıma Atamasını Uygulama
Üç adım vardır: mevcut kaynakları serbest bırakın, kaynak nesnenin kaynaklarını alın ve kaynak nesneyi boş bırakın.
String& operator=(String&& other) noexcept {
if (this != &other) {
delete[] data_;
data_ = other.data_;
size_ = other.size_;
other.data_ = nullptr;
other.size_ = 0;
}
return *this;
}noexcept Neden Önemlidir?
Taşıma işlemlerini mümkün olduğunda noexcept olarak işaretleyin. std::vector gibi standart kapsayıcılar, yeniden boyutlandırma sırasında taşıma işlemlerini yalnızca noexcept iseler kullanır; aksi hâlde özel durum güvenliği için kopyalamaya geri döner.
Beş Kuralı
Bu beş üyeden herhangi birini yazıyorsanız beşinin tamamını düşünün:
- Yıkıcı
- Kopya kurucusu
- Kopya ataması
- Taşıma kurucusu
- Taşıma ataması
Sıfır Kuralı
Daha da iyisi, hiçbirini yazmayın. Üyeleri RAII türleri (vektörler, dizeler, akıllı işaretçiler) olarak saklayın. Derleyici tarafından oluşturulan varsayılanlar doğru ve verimli şekilde çalışır.
class Widget {
std::string name_;
std::vector<int> data_;
// No need for destructor, copy, or move — compiler does the right thing
};Derleyici Taşıma İşlemlerini Ne Zaman Üretir
Derleyici, varsayılan taşıma üyelerini yalnızca şu durumlarda üretir:
- Kullanıcı tarafından bildirilmiş bir kopyalama kurucusu, kopyalama atama işleci, yıkıcı veya taşıma üyesi yoksa
- Tüm üyeler ve temel sınıflar kendileri taşınabilir durumdaysa
Varsayılan ve Silinmiş Taşıma İşlemleri
Derleyici tarafından üretilen taşıma işlemlerini açıkça isteyebilir veya engelleyebilirsiniz.
class Widget {
public:
Widget(Widget&&) = default;
Widget& operator=(Widget&&) = default;
// or
Widget(Widget&&) = delete;
};Taşıma İşleminden Sonra
Taşınan nesne geçerli ancak belirtilmemiş bir durumdadır. Şunları yapabilirsiniz:
- Nesneyi yok etmek
- Nesneye yeni bir değer atamak
- Önkoşulu olmayan herhangi bir işlemi çağırmak (size(), empty(), clear())
Kullanım Alanları
Taşıma semantiği şu işlemleri hızlandırır:
- Büyük nesneleri döndürmek (RVO devreye girmediğinde)
- Büyük nesneleri kapsayıcılara yerleştirmek (rvalue'lar için push_back)
- Kendi kaynak sahibi türlerinizi uygulamak
Hızlı Kontrol
Taşıma kurucuları ve taşıma atama işleçleri neden noexcept olarak işaretlenmelidir?
Özet
Taşıma kurucuları ve taşıma atama işleçleri, kısa süre içinde yok olacak bir rvalue'nun kaynaklarını devralır. Kapsayıcıların hızını artırmak için bunları noexcept olarak işaretleyin. Beşler Kuralı'nı veya daha iyisi, standart RAII türlerini birleştirerek Sıfırlar Kuralı'nı uygulayın.
Sıkça Sorulan Sorular
“Taşıma Yapıcıları ve Taşıma Ataması” dersi ücretsiz mi?
Evet — “Taşıma Yapıcıları ve Taşıma Ataması” 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.
“Taşıma Yapıcıları ve Taşıma Ataması” dersinde ne öğreneceğim?
Taşıma yapıcılarını ve taşıma atama operatörlerini doğru şekilde uygulayın 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 4. dersidir.
“Taşıma Yapıcıları ve Taşıma Ataması” 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
- Lvalue ve Rvalue Ayrımı
- Rvalue Referansları ve && Söz Dizimi
- std::move ve std::forward
- Taşıma Yapıcıları ve Taşıma Ataması