Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции / Лекции 1-2.docx
Скачиваний:
0
Добавлен:
11.02.2026
Размер:
142.98 Кб
Скачать

Инициализация массивов в классе

Рассмотрим класс с массивом в качестве переменной-члена:

class Values {

private:

const int m_array[7];

};

До C++11 мы могли только обнулить массив через список инициализации:

class Values {

private:

const int m_array[7];

public:

Values(): m_array {} // обнуляем массив

{// Если мы хотим, чтобы массив имел значения, то мы должны здесь

//использовать присваивание

}

};

Однако в C++11 вы можете полностью инициализировать

массив, используя uniform-инициализацию:

class Values {

private:

const int m_array[7];

public:

Values(): m_array { 3, 4, 5, 6, 7, 8, 9 } // используем uniform-

//инициализацию для инициализации массива

{ }

};

Инициализация переменных-членов, которые являются классами

Список инициализации членов также может использоваться для инициализации членов, которые являются классами:

#include <iostream>

class A {

public:

A(int a) { std::cout << "A " << a << "\n"; }

};

class B {

private:

A m_a;

public:

B(int b)

: m_a(b-1) // вызывается конструктор A(int) для инициализации

// члена m_a

{ std::cout << "B " << b << "\n"; }

};

Int main() {

B b(7);

return 0;

}

Результат выполнения программы:

A 6

B 7

При создании переменной b вызывается конструктор B(int) со значением 7.

До того, как тело конструктора выполнится, инициализируется m_a, вызывая конструктор  A(int) со значением 6.

Таким образом, сначала выведется A 6 .

Затем управление возвратится обратно к конструктору B(), и тогда уже он выполнится и выведется B 7.

Использование списков инициализации

Если список инициализации помещается на той же строке, что и имя конструктора, то лучше всё разместить в одной строке:

class Values {

private:

Int m_value1;

double m_value2;

char m_value3;

public:

Values() : m_value1(3), m_value2(4.5), m_value3('d') // всё находится

// в одной строке

{ }

};

Если список инициализации членов не помещается в строке с именем конструктора, то на следующей строке (используя перенос) инициализаторы должны быть с отступом:

class Values {

private:

Int m_value1;

double m_value2;

char m_value3;

public:

Values(int value1, double value2, char value3='d') // на этой строке

// уже и так много чего

: m_value1(value1), m_value2(value2), m_value3(value3) // поэтому //переносим инициализаторы на новую строку (не забываем //использовать отступ)

{ }

};

Если все инициализаторы не помещаются на одной строке, то вы можете выделить для каждого инициализатора отдельную строку:

class Values

{

private:

Int m_value1;

double m_value2;

char m_value3;

float m_value4;

public:

Values(int value1, double value2, char value3='d', float value4=17.5)

// на этой строке уже и так много чего,

:m_value1(value1), //поэтому выделяем каждому инициализатору

//отдельную строку, не забывая о запятой в конце

m_value2(value2),

m_value3(value3),

m_value4(value4)

{ }

};