- •Классы, Объекты и Методы
- •Struct DateStruct {
- •Int month;
- •Int year;
- •Методы классов
- •Void print () {
- •Int main () {
- •Int main () {
- •Int main () {
- •Спецификаторы доступа public и private
- •Int year; // открыто по умолчанию
- •Int main () {
- •Int main () {
- •Int main ()
- •Структуры. Классы
- •Инкапсуляция, Геттеры и Сеттеры Инкапсуляция
- •Int m_array[10];
- •Int main () {
- •IntArray array;
- •Void setValue(int index, int value) {
- •Функции доступа (геттеры и сеттеры)
- •Int m_month;
- •Int m_year;
- •Int main () {
- •Краткий обзор l-value и r-value
- •Инициализация ссылок
- •Ссылки в качестве параметров в функциях
- •Void changeN (int &ref) {
- •Int main () {
- •Int value1;
- •Int otherValue;
- •Ссылки. Указатели
- •Конструкторы
- •Int main () {
- •Конструкторы по умолчанию
- •Конструкторы с параметрами
- •Int m_numerator;
- •Int m_denominator;
- •Int getNumerator () {return m_numerator; }
- •Int getDenominator () {return m_denominator; }
- •Копирующая инициализация
- •Уменьшение количества конструкторов
- •Неявно генерируемый конструктор по умолчанию
- •Int main () {
- •Int main () {
- •Классы, содержащие другие классы
- •Int main() {
- •Список инициализации членов класса
- •Списки инициализации членов класса
- •Int m_value1;
- •Values() {
- •Int m_value1;
- •Инициализация массивов в классе
- •Инициализация переменных-членов, которые являются классами
- •Int main() {
- •Использование списков инициализации
- •Int m_value1;
- •Int m_value1;
- •Int m_value1;
- •Порядок выполнения в списке инициализации
- •Инициализация нестатических членов класса
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Void print() {
- •Int main() {
- •Делегирующие конструкторы
- •Void DoX() {
- •Init();
- •Init();
- •Void Init()
- •Int main() {
- •Ещё о делегирующих конструкторах
- •Деструкторы
- •Имена деструкторов
- •Пример использования деструктора на практике
- •Выполнение конструкторов и деструкторов
- •Int getId() { return m_nId; }
- •Int main() {
- •Предупреждение о функции exit()
- •Скрытый указатель this
- •Скрытый указатель *this
- •Int m_number;
- •Int getNumber() { return m_number; }
- •Int main() {
- •Указатель this всегда указывает на текущий объект. Явное указание указателя this
- •Int data;
- •Цепочки методов класса
- •Заключение
Порядок выполнения в списке инициализации
Удивительно, но переменные в списке инициализации не инициализируются в том порядке, в котором они указаны.
Вместо этого они инициализируются в том порядке, в котором объявлены в классе, поэтому следует соблюдать следующие рекомендации:
Не инициализируйте переменные-члены таким образом, чтобы они зависели от других переменных-членов, которые еще не инициализированы (другими словами, убедитесь, что все ваши переменные-члены правильно инициализируются, даже если порядок в списке инициализации отличается).
Инициализируйте переменные в списке инициализации в том порядке, в котором они объявлены в классе.
Заключение
Списки инициализации членов позволяют инициализировать члены, а не присваивать им значения.
Это единственный способ инициализации констант и ссылок, которые являются переменными-членами вашего класса.
Во многих случаях использование списка инициализации может быть более результативным, чем присваивание значений переменным-членам в теле конструктора.
Списки инициализации работают как с переменными фундаментальных типов данных, так и с членами, которые сами являются классами.
Задание
Напишите класс с именем 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';
}
};
