Спочатку дозвольте мені пояснити, що таке список ініціалізаторів пам’яті . Список MEM-ініціалізатор- це розділений комами список MEM-ініціалізатор с, де кожен MEM-ініціалізатор є ім'я елемента з подальшим (, з подальшим виразом-лист , за яким слід ). Список виразів - це спосіб побудови члена. Наприклад, в
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)
{
}
};
ає-ініціалізатор-лист конструктора наданого користувача, який не-аргументи name(s_str, s_str + 8), rname(name), crname(name), age(-4). Цей MEM-ініціалізатор-списку означає , що nameелемент инициализируется в std::stringконструкторі , який приймає два вхідних ітераторів , то rnameелемент инициализируется з посиланням name, то crnameелемент инициализируется з константної-посиланням name, а ageелемент инициализируются зі значенням -4.
У кожного конструктора є свій список ініціалізаторів пам’яті , і члени можуть бути ініціалізовані лише у встановленому порядку (в основному порядку, в якому члени оголошуються в класі). Таким чином, члени Exampleможуть бути ініційовані лише в наступному порядку: ptr, name, pname, rname, crname, і age.
Якщо ви не вказуєте ініціалізатор пам’яті члена, стандарт C ++ говорить:
Якщо сутність є нестатичним членом даних ... типу класу ..., сутність ініціалізується за замовчуванням (8.5). ... Інакше сутність не ініціалізується.
Ось, оскільки nameце нестатичний член даних типу класу, він ініціалізується за замовчуванням, якщо nameв списку пам’яті-ініціалізатора не було вказано жодного ініціалізатора . Усі інші члени Exampleне мають типу класу, тому вони не ініціалізовані.
Коли стандарт каже, що вони не ініціалізовані, це означає, що вони можуть мати будь-яке значення. Таким чином, оскільки вищезазначений код не ініціалізувався pname, він може бути чим завгодно.
Зауважте, що ви все одно повинні дотримуватися інших правил, таких як правило, згідно з яким посилання повинні завжди ініціалізуватися. Помилка компілятора не ініціалізувати посилання.