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

Порядок выполнения в списке инициализации

Удивительно, но переменные в списке инициализации не инициализируются в том порядке, в котором они указаны.

Вместо этого они инициализируются в том порядке, в котором объявлены в классе, поэтому следует соблюдать следующие рекомендации:

    Не инициализируйте переменные-члены таким образом, чтобы они зависели от других переменных-членов, которые еще не инициализированы (другими словами, убедитесь, что все ваши переменные-члены правильно инициализируются, даже если порядок в списке инициализации отличается).

    Инициализируйте переменные в списке инициализации в том порядке, в котором они объявлены в классе.

Заключение

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

Это единственный способ инициализации констант и ссылок, которые являются переменными-членами вашего класса.

Во многих случаях использование списка инициализации может быть более результативным, чем присваивание значений переменным-членам в теле конструктора.

Списки инициализации работают как с переменными фундаментальных типов данных, так и с членами, которые сами являются классами.

Задание

Напишите класс с именем RGBA, который содержит 4 переменные-члены типа std::uint8_t (подключите заголовочный файл cstdint для доступа к типу std::uint8_t):

uint8_t 1 байт unsigned от 0 до 255

    m_red;

m_green;

m_blue;

m_alpha

Присвойте 0 в качестве значения по умолчанию для m_red, m_green и m_blue, и 255 для m_alpha. Создайте конструктор со списком инициализации членов, который позволит пользователю передавать значения для m_red,m_green, m_blue и m_alpha. Напишите функцию print(), которая будет выводить значения переменных-членов.

Подсказка: Если функция print() работает некорректно, то убедитесь, что вы конвертировали std::uint8_t в int.

Подсказка: Если функция print() работает некорректно, то убедитесь, что вы конвертировали std::uint8_t в int.

Следующий код функции main():

int main() {

RGBA color(0, 135, 135);

color.print();

return 0;

}

Должен выдавать следующий результат:

r=0 g=135 b=135 a=255

Инициализация нестатических членов класса

   При написании класса  с несколькими конструкторами, необходимость указывать значения по умолчанию всем членам в каждом конструкторе приведет к написанию лишнего кода.

Если вы обновите значение по умолчанию какого-то одного члена, то вам придется лезть в каждый конструктор.

Начиная с C++11, обычным переменным-членам класса (те, которые не используют ключевое слово static) можно задать значение по умолчанию напрямую — использовать инициализацию:

#include <iostream>

class Something {

private:

double m_length = 3.5; // m_length имеет значение по умолчанию 3.5

double m_width = 3.5; // m_width имеет значение по умолчанию 3.5

public:

Something() {

// Этот конструктор использует значения по умолчанию, приведенные //выше, так как здесь эти значения не переопределяются

}

Void print() {

std::cout << "length: " << m_length << " and width: " << m_width << '\n';

}

};