SORU
27 Kasım 2012, Salı


Nasıl "=varsayılan" farklı " {}&; varsayılan yapıcı ve yıkıcı"?

Ben aslında sadece yıkıcılar hakkında bir soru olarak gönderildi, ancak artık varsayılan kurucuyu dikkate ekliyorum. İşte ilk soru:

Eğer benim sınıf sanal ama bir yıkıcı vermek istiyorum derleyici oluşturmak aynı aksi takdirde, =default.

class Widget {
public:
   virtual ~Widget() = default;
};

Ama daha az yazmak ile aynı etkiyi kullanarak elde edebilirim gibi görünüyor boş tanımı:

class Widget {
public:
   virtual ~Widget() {}
};

Bu iki tanım farklı davranır herhangi bir yolu var mı?

Cevaplar bu soru için gönderildi dayalı, varsayılan oluşturucu için benzer bir durum söz konusu gibi görünüyor. "=default" ve "{}" yıkıcılar için, benzer şekilde neredeyse varsayılan oluşturucular bu seçenekler arasında anlam olarak hiçbir fark yoktur? arasında anlam farkı neredeyse yok verilen Yani, bu tür nesneleri oluşturulan ve özelleştirmeler de bir tür oluşturmak istiyorum varsayarak, neden diyeyim

Widget() = default;

yerine

Widget() {}

?

Ben ise kendi özgün yazdıktan sonra bu soruyu uzanan bazı kuralları ihlal ettiysem özür dilerim. Varsayılan oluşturucular için neredeyse özdeş bir soru göndermeden daha az arzu edilen bir seçenek olarak bana vurdu.

CEVAP
27 Kasım 2012, Salı


Bu yıkıcılar hakkında daha kurucular sorarken tamamen farklı bir soru.

Eğer yıkıcı virtual, sonra ise fark önemsiz, as Howard pointed out. Eğer yıkıcı oldu ancaksanal olmayantamamen farklı bir hikaye. Aynı markalar için de geçerlidir.

Özel üye işlevleri için = default sözdizimi (varsayılan yapıcı, hareket kurucular atama, yıkıcı etc/kopyala/) kullanarak basit {} yapmaktan çok farklı bir şey anlamına gelir. İkincisi, fonksiyonu olur "kullanıcı" sağlanmıştır. Ve bu her şeyi değiştirir.

Bu C 11 tanımıyla önemsiz bir sınıf

struct Trivial
{
  int foo;
};

Eğer bir varsayılan oluşturmak için çalışırsanız, derleyici varsayılan bir kurucu otomatik olarak oluşturur. Aynısı kopyala/hareket ve tahrip. Kullanıcı bu üye işlevleri sağlamak için C 11 belirtimi bu bir "sınıf. önemsiz görmektedir Bu nedenle, yasal, kendi içeriğini etrafında onları başlatmak için memcpy gibi yapmak ve benzeri.

Bu:

struct NotTrivial
{
  int foo;

  NotTrivial() {}
};

Adından da anlaşılacağı gibi, bu artık önemsiz. Varsayılan kullanıcı sağlanan bir yapı var. Eğer boş olup olmadığı önemli değildir; C 11 kuralları ile ilgili olarak, bu önemsiz bir konu olabilir.

Bu:

struct Trivial2
{
  int foo;

  Trivial2() = default;
};

Adından da anlaşılacağı gibi yine, bu önemsiz bir türüdür. Neden? Derleyici otomatik olarak varsayılan kurucu üretir dedi diye. Yapıcı bu nedenle "kullanıcı tarafından sağlanan." Ve bu nedenle, bu tip kullanıcı tarafından sağlanan varsayılan bir kurucu önemi yok, çünkü önemsiz olarak sayar.

= default sözdizimi gibi işlevleri oluşturulmasını engelleyen başlıca kopya yapıcılar gibi şeyler yapmak için oraya üye işlevler ekleme/atama. Ama aynı zamanda derleyici özel davranış tetikleyiciler/çok yıkıcı varsayılan kurucular yararlı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Android Authority

    Android Auth

    3 NİSAN 2011
  • Dom Esposito

    Dom Esposito

    26 Mayıs 2011
  • MrOctopi

    MrOctopi

    6 Aralık 2010