2008-10-22 14 views
43

Neden üyeleri bir yapının içinde başlatamıyoruz?Neden üyeleri bir yapının içinde başlatamıyoruz?

örnek:

struct s { 
    int i = 10; 
}; 
+1

Bu bir tanım ve bir bildirim değil – Archmede

+1

Son C++ ile aşağıdaki yanıtları görebiliriz. (Son yıllarda olduğu gibi C++ olarak da bilinir.) Bu sorunun C'yi yeniden kurduğunu biliyorum, fakat C++ cevapları çoğumuzun aradığı şey ... – sage

cevap

34

Eğer structbildiriminde içinde statik olmayan üye başlatmak isterseniz:

C

++ (değil C) structs sınıflara neredeyse eşanlamlıdır ve olabilir üyeler kurucuda başlatıldı.

struct s { 
    int i; 

    s(): i(10) 
    { 
    } 
}; 

bir örneği başlatmak isterseniz: C veya C

++:

struct s { 
    int i; 
}; 

... 

struct s s_instance = { 10 }; 

C99 ayrıca bir özelliktir tayin denilen etti ilklendiriciler: Orada

struct s { 
    int i; 
}; 

... 

struct s s_instance = { 
    .i = 10, 
}; 

ayrıca C99 desi'ya çok benzer bir GNU C uzantısıdır başlatıcıları gnated, ama daha taşınabilir bir şey kullanmak daha iyidir:

struct s s_instance = { 
    i: 10, 
}; 
+0

En son örneğinizi detaylandırır mısınız? – barnes

8

Düzenleme: soru aslen c++ etiketlendi ama afiş ben cevabı ayrılıyorum, c yüzden soru-etiketli yeniden hakkında olduğunu söyledi gerçi ... C

bir struct üye ve miras için public yerine private için sadece class hangi varsayılan edilir ++.

C++, sadece diğer üyeleri yapıcıda başlatılması veya edilmelidir static const tamamlayıcı üye içi başlatılmasını sağlar (değişkeni bildirirken) struct bir başlatma listesinde bir POD ise.

struct bad { 
    static int answer = 42; // Error! not const 
    const char* question = "what is life?"; // Error! not const or integral 
}; 

struct good { 
    static const int answer = 42; // OK 
    const char* question; 
    good() 
     : question("what is life?") // initialization list 
     { } 
}; 

struct pod { // plain old data 
    int answer; 
    const char* question; 
}; 
pod p = { 42, "what is life?" }; 
32

Yapılandırma tanımı, yapı tanımının, başlatılabilen bir değişken değil, bir türü bildirmesidir. Örneğiniz:

struct s { int i=10; }; 

Bu, herhangi bir değişken bildirmez - bir türü tanımlar. harika olan (

olarak Dama kaydetti
struct s { int i; } t = { 10 }; 

, C99, ayrıca belirlenen kullanabilirsiniz başlatıcıları: Bir değişken bildirmek için, } ve ; arasında bir isim eklemek istiyorum ve sonra sonradan başlatmak istiyorum İyileştirme - Bir gün, C Fortran 66'nın veri başlatma için sahip olduğu diğer özelliklerle yetişecek ve öncelikle başlatıcıları belirli sayıda tekrarlayacaktır). Bu basit yapı ile hiçbir faydası yoktur.20 üyeye sahip bir yapınız varsa ve yalnızca birini başlatmak için gerekliyse (yapının geri kalanının ya da başlatılmamış olduğunu belirten bir işaretiniz olduğu için), daha yararlıdır:

struct s { int i; } t = { .i = 10 }; 

Bu gösterim, birliğin hangi öğesinin başlatıldığını seçmek için sendikaları başlatmak için de kullanılabilir.

2

Herhangi bir yapıyı gerçekte yaptığımızdan daha iyi ilan ettiğimizden, derleyiciyi onların varlığı hakkında bilgilendirmemiz, yani bunun için ayrılmış bellek olmaması ve üyeye bunun için bir bellek olmadan başlatılması durumunda başlatılamıyoruz. Normalde, değişken derleyicinin bu değişken için bellek ayırdığı yere bağlı olan herhangi bir değişkeni başlattığımızda ne olur.

int a = 10; 
  • o oto yığın bellekte o verileri tutmak için nelerin gerekli olduğunu hafıza hafıza

tahsis edecek veri bölümlerde daha küresel var Yani eğer

  • tahsis edecek ama daha olursa yapı yok bellek yok o kadar başlatmak mümkün değildir. C++ 11 olarak aşağıdaki beyanı artık izin verildiğini

  • +1

    Cevabınız güzel gözükse de, bunu daha net hale getirmeye çalışın, örneğin sözcüklerinizi düzeltin! – gsamaras

    +0

    ya da kesinlikle endişe için teşekkürler. –

    8

    Not:

    struct s { 
        int i = 10; 
    }; 
    

    Bu eski bir sorudur, ancak Google'da oldukça üst sıralarda ve aynı zamanda açıklık olabilir.

    +0

    Tam olarak ne yapıyor? Bu varsayılan kurucunun başlangıç ​​değeri ile karşılaştırılabilir mi? Eğer öyleyse: bu atama, bir kopya veya hareket ettirici çalıştırılırsa da gerçekleştirilir mi? – starturtle

    +0

    Üye, açıkça başlatılmamışsa, kurucularınızın üye başlatma listesine temel olarak eklenir. – Trass3r

    0

    Sadece bir üye değil, değişken olduğunu söylediniz. Bir değişken bildirdiğinizde, derleyici, değerleri koyabileceğiniz değişkenler için de bellek alanı sağlar. Bir struct üyesi için, derleyici onun için bellek alanı vermiyorsa, bu yapı türünde bir değişken oluşturmazsanız, yapı üyelerine değerler atayamazsınız.

    İlgili konular