Önce mem-başlatıcı listesinin ne olduğunu açıklayayım . Bir mem-başlatıcı-listesi , her mem-başlatıcısının bir üye adı ve ardından bir ifade listesi ve ardından a, virgülle ayrılmış bir mem-başlatıcıları listesidir . İfadesi listesi üyesi oluşturulur nasıl. Örneğin,(
)
static const char s_str[] = "bodacydo";
class Example
{
private:
int *ptr;
string name;
string *pname;
string &rname;
const string &crname;
int age;
public:
Example()
: name(s_str, s_str + 8), rname(name), crname(name), age(-4)
{
}
};
Mem-başlatıcı-liste kullanıcı tarafından sağlanan, hiç argümanlar yapıcısı taşımaktadır name(s_str, s_str + 8), rname(name), crname(name), age(-4)
. Bu mem-başlatıcı listesi , name
üyenin iki giriş yineleyicisi alan std::string
yapıcı tarafından başlatıldığı , rname
üye bir referansla başlatılır name
, crname
üye bir const referansı ile başlatılır name
ve age
üye değerle başlatılır -4
.
Her kurucunun kendi mem-başlatıcı listesi vardır ve üyeler yalnızca önceden belirlenmiş bir sırayla (temel olarak üyelerin sınıfta beyan edildikleri sıraya göre) başlatılabilir. Bu nedenle, üyeleri Example
tek amacıyla başlatıldı: ptr
, name
, pname
, rname
, crname
, ve age
.
Bir üyenin mem başlatıcısı belirtmediğinizde , C ++ standardı şöyle der:
Varlık, sınıf ... türünde statik olmayan bir veri üyesiyse, varlık varsayılan olarak başlatılır (8.5). ... Aksi takdirde varlık başlatılmaz.
Burada, name
sınıf türünde statik olmayan bir veri üyesi olduğu için name
, mem başlatıcı listesinde herhangi bir başlatıcı belirtilmemişse varsayılan olarak başlatılır . Diğer tüm üyelerin Example
sınıf türü yoktur, bu nedenle başlatılmazlar.
Standart başlatılmadıklarını söylediğinde, bu onların herhangi bir değere sahip olabileceği anlamına gelir . Dolayısıyla, yukarıdaki kod başlatılmadığından pname
, herhangi bir şey olabilir.
Referansların her zaman başlatılması gereken kural gibi başka kurallara uymanız gerektiğini unutmayın. Referansları başlatmamak bir derleyici hatasıdır.