Спочатку дозвольте мені пояснити, що таке список ініціалізаторів пам’яті . Список 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
, він може бути чим завгодно.
Зауважте, що ви все одно повинні дотримуватися інших правил, таких як правило, згідно з яким посилання повинні завжди ініціалізуватися. Помилка компілятора не ініціалізувати посилання.