Kural-of-Üç-Beş Kural C 11 ile olur?
Yani, rvalue başvuruları this wonderful lecture izledikten sonra, her sınıf gibi bir fayda sağlayacağını düşündüm"", template<class T> MyClass(T&& other)
. hareket kurucu ^strong>editve tabii ki bir "atama operatörü eğer varsa", template<class T> MyClass& operator=(T&& other)
cevabı olarak Philipp puan, dinamik olarak atanan üye, ya da genel olarak saklar işaretçiler. Tıpkı senin gibigerekireğer noktalarını uygulamak sözü eğer daha önce kopyala-decimal, atama operatörü ve yıkıcı.
Düşünceler?
CEVAP
Üç Kural, Üç, Dört ve Beş Kuralı olur bence
Her sınıf, açıkça tam olarak tanımlamak gerekir özel üye şu seti fonksiyonları:
- Yok
- Yıkıcı, kopya yapıcı, atama operatörü kopyalayın
Buna ek olarak, açıkça bir yıkıcı tanımlayan her sınıf açıkça bir hareket Kurucu ve/veya taşıma atama operatörü tanımlayabilir.
Genellikle, özel üye aşağıdaki kümelerinden biri fonksiyonlar mantıklı
- Hiçbiri (örtülü olarak oluşturulan özel üye işlevlerini doğru ve hızlı olduğu çok basit sınıflar için)
- Yıkıcı, kopya yapıcı, kopya atama operatör (bu durumda sınıf hareketli olacak)
- Yıkıcı, yapıcı hareket, atama operatörü taşı (bu durumda sınıf, kaynak yönetimi temel kaynak değil copyable bulunduğu sınıflar için copyable faydalı olacaktır
- Yıkıcı, yapıcı kopya, kopya atama operatör, yapıcı hareket (kopya elision çünkü, eğer kopya atama operatör değeri argüman alır, bu ek yükü yok)
- , Kopya yapıcı, atama operatörü kopyalama, yapıcı, yıkıcı hareket, atama operatörü taşıyın
Not bu hareketi Kurucu ve hareket atama operatörü olmayacak oluşturulan bir sınıf olduğunu açıkça beyan eder ve herhangi bir diğer özel üye fonksiyonlar, kopya yapıcı ve kopya atama operatör olmayacak oluşturulan bir sınıf olduğunu açıkça beyan eder bir hareket kurucu veya hareket atama operatörü ve bir sınıf ile açıkça ilan yıkıcı ve örtülü olarak tanımlanan kopya yapıcı veya dolaylı olarak tanımlanmış kopya atama operatör olduğunu kabul kaldırılmış. Özellikle, son derece geçerli aşağıdaki C 03 polimorfik sınıf Bankası
class C {
virtual ~C() { } // allow subtype polymorphism
};
aşağıdaki gibi yazılmış
class C {
C(const C&) = default; // Copy constructor
C(C&&) = default; // Move constructor
C& operator=(const C&) & = default; // Copy assignment operator
C& operator=(C&&) & = default; // Move assignment operator
virtual ~C() { } // Destructor
};
Biraz can sıkıcı, ama muhtemelen başka bir şansımız (özel üye işlevleri Otomatik oluşturulması).
Aksine Kural Üç büyükler, nerede başarısız uymak için kural neden olabilir ciddi hasar, açıkça ilan hareketin Kurucu ve hareket atama operatörüdür genel olarak iyi ama çoğu zaman hassasiyetli açısından verimlilik. Yukarıda da belirtildiği gibi, atama operatörleri sadece hiçbir açıkça kopya yapıcı, atama operatörü kopyalama veya yıkıcı ilan edilirse orada oluşturulan Kurucu ve hareket. Bu yapıcı ve kopya atama operatör kopya otomatik nesil açısından geleneksel C 03 davranışı için simetrik değil, ama çok daha güvenli. Bu olasılığı tanımlamak için hareket kurucular ve hareket atama operatörleri çok yararlı ve oluşturur yeni olanaklar (sadece hareketli sınıflar), ama sınıflar uygun C 03 Kural Üç büyükler yine de güzel.
Kaynak yönetimi sınıfları için temel kaynak kopyalanamaz Eğer kopya kurucu tanımlamak ve atama operatörü olarak silinmiş olarak tanımı Sayan () kopyalayabilirsiniz. Sık sık hala yapıcı ve hareket ödev operatöre taşımak istiyorum. Kopyalama ve taşıma atama operatörleri genellikle C 03 swap
kullanılarak uygulanacaktır. Eğer bir hamle yapıcı ve hareket atama operatörü, uzmanlaşmış std::swap
olacak önemsiz çünkü genel std::swap
kullandığı hareket yapıcı ve hareket atama operatörü varsa, o olmalı yeterince hızlı.
Sınıflar değil demek kaynak yönetimi (yani, hiç boş olmayan yıkıcı) veya alt polimorfizmi (yani, sanal bir yıkıcı) ilan hiçbiri beş özel üye işlevleri; hepsinin olması otomatik olarak oluşturulan ve davranmak, doğru ve hızlı.
CSS örnek: her İKİ sınıf varsa, sadece...
Nasıl Eşit bir jQuery kural eklemek.do...
Birden fazla sınıflar ile hedef öğeler...
hangi kural gitignore dosyası yok sayı...
Jenerik-ve kural Koymak...