SORU
14 EYLÜL 2011, ÇARŞAMBA


Neden C varsayılan yapı, sabit bir nesneye kullanıcı tarafından sağlanan varsayılan bir kurucu gerektirir mi?

C standardı (bölüm 8.5) diyor ki:

Eğer bir program sabit nitelikli T türü bir nesnenin varsayılan başlatma için çağırırsa, T kullanıcı tarafından sağlanan varsayılan bir kurucu ile bir sınıf türü olacaktır.

Neden? Kullanıcı tarafından sağlanan bir kurucu bu durumda gerekli herhangi bir neden düşünemiyorum.

struct B{
  B():x(42){}
  int doSomeStuff() const{return x;}
  int x;
};

struct A{
  A(){}//other than "because the standard says so", why is this line required?

  B b;//not required for this example, just to illustrate
      //how this situation isn't totally useless
};

int main(){
  const A a;
}

CEVAP
14 EYLÜL 2011, ÇARŞAMBA


Nedeni ise sınıf kullanıcı tanımlı oluşturucu yok eğer doğru değilse, o zaman POD olur, ve POD sınıfı varsayılan: başlatılmadı. Eğer öyleyse başlatılmamış olan BÖLMENİN bir sabit nesne bildirirseniz, ne işe yarar? Standart nesne gerçekten yararlı olabilir, böylece bu kuralı zorlar bence.

struct POD
{
  int i;
};

POD p1; //uninitialized - but don't worry we can assign some value later on!
p1.i = 10; //assign some value later on!

POD p2 = POD(); //initialized

const POD p3 = POD(); //initialized 

const POD p4; //uninitialized  - error - as we cannot change it later on!

Ama eğer sınıfı non-POD: bir yaparsanız

struct nonPOD_A
{
    nonPOD_A() {} //this makes non-POD
};

nonPOD_A a1; //initialized 
const nonPOD_A a2; //initialized 

POD ve non-POD arasındaki farka dikkat edin.

Kullanıcı tanımlı oluşturucu sınıfı olmayan BÖLME yapmak için tek yoldur. Bu yapabileceğiniz birkaç yolu vardır.

struct nonPOD_B
{
    virtual void f() {} //virtual function make it non-POD
};

nonPOD_B b1; //initialized 
const nonPOD_B b2; //initialized 

Fark nonPOD_B kullanıcı tanımlı oluşturucu tanımlı değil. Derleme. Derleme:

Ve yorum sanal işlevi, daha sonra beklendiği gibi hata veriyor:


Bence bu pasaj, yanlış anladın. Önce bu (§8.5/9)diyor:

Eğer başlatıcı bir nesne için belirtilen ve nesne (muhtemelen cv-nitelikli)non-POD sınıfyazın (veya dizi bunun gibi), nesne varsayılan başlatılmış olacaktır; [...]

-POD olmayan sınıf hakkında konuşuyormuhtemelen nitelikli cvyazın. Bu, non-POD nesne hiçbir başlatıcı belirtilmişse orada varsayılan başlatılmış olacaktır. Ve ne olduğunuvarsayılan başlatıldı? Non-POD, spec diyor (§8.5/5)için,

Varsayılan-başlatma türü T demektir bir nesne:
eğer T (non — POD sınıf türü (Madde 9) ise, T için varsayılan Kurucu (ve başlatma eğer T erişilebilir varsayılan oluşturucuya sahip hasta-oluşur); olarak adlandırılır

Sadece bahsediyorvarsayılan kurucuT, kullanıcı tanımlı ya da derleyici tarafından oluşturulan olsun kendi yersizdir.

Eğer bu kadar açık varsa, o zaman spec sonraki ne anlama geldiklerini ((§8.5/9),

[...]; if nesne sabit nitelikli türü ise, temel sınıf türü kullanıcı tarafından bildirilen varsayılan bir oluşturucuya sahip olmalıdır.

Bu metin anlamına gelir yani program kötü oluşturulacaktıreğernesnesabit nitelikliPOD türü ve başlatıcı belirtilen var POD varsayılan başlatıldı ():

POD p1; //uninitialized - can be useful - hence allowed
const POD p2; //uninitialized - never useful  - hence not allowed - error

Bu arada this compiles fine non-POD onun yüzünden olabilirvarsayılan başlatıldı.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DominicFear

    DominicFear

    30 Kasım 2006
  • HouseholdHacker

    HouseholdHac

    6 Kasım 2007
  • ThePhestor

    ThePhestor

    22 Mart 2011