Ö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::stringyapı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 nameve 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 Exampletek 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, namesı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 Examplesı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.