SORU
24 Ocak 2011, PAZARTESİ


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
24 Ocak 2011, PAZARTESİ


Üç 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ı.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DrePwn

    DrePwn

    22 Temmuz 2011
  • Learn Math Tutorials

    Learn Math T

    20 Kasım 2011
  • Matt Stokes

    Matt Stokes

    22 Ocak 2008