SORU
10 Mart 2010, ÇARŞAMBA


Varsayılan oluşturucu yerleşik türleri başlatılamıyor

Varsayılan oluşturucu (derleyici tarafından oluşturulan)-dahili-tip başlatılamıyor?

CEVAP
10 Mart 2010, ÇARŞAMBA


Bir sınıf örtülü olarak tanımlanan (derleyici tarafından) varsayılan yapıcı dahili tip üyeleri başlatmıyor.

Ancak, bazı durumlarda bir sınıf örneğinin başlatılması diğer yöntemlerle yapılabilir unutmayın. Kurucu tarafından varsayılan kurucu tarafından, ne de hiç değil.

Örneğin, C sözdizimi sınıf C() her zaman varsayılan kurucuyu çağıran yaygın yanlış bir inanç var. Aslında, C() çok gerçekleştirir sözdizimi denirdeğer-başlatmasınıf örneği. Sadece eğer değilse, varsayılan kurucusunu çağırmak olacaktırkullanıcı ilan etti. (C 03. Eğer sınıf non-POD ise sadece 98 -) C. Eğer sınıf yok kullanıcı-ilan yapıcı, C() olmaz Ara derleyici tarafından sağlanan varsayılan yapıcı, daha ziyade yapacak özel bir başlatma o değil dahil kurucu C. Bunun yerine, doğrudan-başlatma değeri olacaktır sınıfın her üyesi. Yerleşik türleri için sıfır başlatma sonuçlanır.

Eğer sınıf kullanıcı ilan var mı yok mu, örneğin, kurucu

class C { 
  int x;
};

sonra derleyici örtük olarak sağlayacaktır. Derleyici tarafından sağlanan yapıcı bir şey, C::x başlatmak değil yani

C c; // Compiler-provided default constructor is used
// Here `c.x` contains garbage

Yine de, aşağıdaki başlatmaları() açık başlatıcı kullandıkları için sıfır-başlatma x

C c = C(); // Does not use default constructor for `C()` part
           // Uses value-initialization feature instead
assert(c.x == 0);

C *pc = new C(); // Does not use default constructor for `C()` part
                 // Uses value-initialization feature instead
assert(pc->x == 0);

() başlatıcı davranış ve C 03, ancak bu durumda değil C 98 arasında bazı bakımlardan farklıdır. C aynı olacak yukarıdaki sınıf için: () başlatıcı C::x sıfır başlatma gerçekleştirir.

Yapıcı katılımı olmadan gerçekleştirilen başlatma başka bir örnek, tabii ki, toplu başlatma

C c = {}; // Does not use any `C` constructors at all. Same as C c{}; in C  11.
assert(c.x == 0);

C d{}; // C  11 style aggregate initialization.
assert(d.x == 0);

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Derek Banas

    Derek Banas

    12 AĞUSTOS 2008
  • kidrauhl

    kidrauhl

    15 Ocak 2007
  • RomanAtwood

    RomanAtwood

    18 Kasım 2009