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;
};
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;
};
Eğer struct
bildiriminde içinde statik olmayan üye başlatmak isterseniz:
++ (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,
};
En son örneğinizi detaylandırır mısınız? – barnes
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?" };
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 kaydettistruct 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.
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;
tahsis edecek veri bölümlerde daha küresel var Yani eğer
Cevabınız güzel gözükse de, bunu daha net hale getirmeye çalışın, örneğin sözcüklerinizi düzeltin! – gsamaras
ya da kesinlikle endişe için teşekkürler. –
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.
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
Üye, açıkça başlatılmamışsa, kurucularınızın üye başlatma listesine temel olarak eklenir. – Trass3r
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.
Bu bir tanım ve bir bildirim değil – Archmede
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