Hata mesajı, varsayılan kurucunun dolaylı olarak silindiğini açıkça belirtir . Hatta nedenini söylüyor: sınıf statik olmayan bir const değişkeni içeriyor ve bu değişken varsayılan ctor tarafından başlatılmayacak.
class X {
const int x;
};
Olduğundan beri X::x
, const
başlatılması gerekir - ancak varsayılan bir ctor normalde onu başlatmaz (çünkü bir POD türü). Bu nedenle, varsayılan bir ctor elde etmek için kendiniz bir tane tanımlamanız gerekir (ve onu başlatmanız gerekir x
). Referans olan bir üye ile aynı tür bir durumla karşılaşabilirsiniz:
class X {
whatever &x;
};
Muhtemelen her ikisinin de, esasen aynı nedenden ötürü, bir atama operatörünün örtük oluşturulmasını da devre dışı bırakacağını belirtmek gerekir. Örtük atama operatörü normalde üyelere göre atama yapar, ancak bir const üyesi veya referans üyesi ile bunu yapamaz çünkü üye atanamaz. Atamanın çalışması için kendi atama operatörünüzü yazmanız gerekir.
Bu nedenle bir const
üye tipik olarak statik olmalıdır - bir atama yaptığınızda, yine de const üyesini atayamazsınız. Tipik bir durumda, tüm örnekleriniz aynı değere sahip olacaktır, bu nedenle hepsi aynı değere sahip bir değişkenin çok sayıda kopyasına sahip olmak yerine tek bir değişkene erişimi paylaşabilirler.
Elbette farklı değerlere sahip örnekler oluşturmak mümkündür - (örneğin) nesneyi oluşturduğunuzda bir değer iletirsiniz, böylece iki farklı nesne iki farklı değere sahip olabilir. Ancak, bunları takas etmek gibi bir şey yapmaya çalışırsanız, const üyesi takas edilmek yerine orijinal değerini koruyacaktır.