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

  Юрий Ворон  | 

    | 

  Обновл. 24 Фев 2018  | 

 5217

 ǀ   8 

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

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

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

length: 3.5 and width: 3.5

Таким образом вы предоставляете значения по умолчанию вашим переменным-членам, которые будут использоваться вашими конструкторами, если сами конструкторы не предоставят эти значения (через список инициализации членов).

Однако конструкторы все еще определяют тип объектов, которые могут быть созданы. Рассмотрим следующий случай:

Несмотря на то, что мы предоставили значения по умолчанию всем переменным-членам класса, конструктор по умолчанию предоставлен не был, поэтому мы не можем создать объект класса Something без параметров.

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

Результат:

length: 4.5 and width: 5.5

Обратите внимание, инициализация нестатических членов класса требует использования либо знака равенства, либо фигурные скобки (uniform инициализация) — прямая инициализация работать не будет.

Правило: Используйте инициализацию нестатических членов для указания значений по умолчанию переменным-членам.

Тест

Задание №1

Добавьте в следующую программу инициализацию нестатических членов и список инициализации членов:

Результат должен быть следующий:

color: blue and radius: 20
color: red and radius: 20
color: blue and radius: 30
color: red and radius: 30

Ответ 1

Задание №2

Зачем мы объявили пустой конструктор по умолчанию в программе выше? Все же переменные-члены и так имеют значения по умолчанию.

Ответ 2

Объект defl класса Thing будет искать конструктор по умолчанию. Если его не будет, то компилятор выдаст ошибку.


Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (33 оценок, среднее: 4,88 из 5)
Загрузка...

Комментариев: 8

  1. kmish:

    С инициализацией нестатических членов получается нужно аж 4 конструктора (в тесте выше). При этом через список инициализации или присваивания достаточно всего 2 конструктора (в тесте урока 116). Учитывая, что рекомендуется использовать меньшее кол-во конструкторов, выходит что инициализация списком лучше?

  2. Andrey:

    Вот этот урок пока что не дается. Значения по умолчанию которые ни где не используются, но нужны потому что "Объект defl класса Thing будет искать конструктор по умолчанию. Если его не будет, то компилятор выдаст ошибку."
    Скопировал полностью код с задания номер 1. Намеряно не выполнил задание номер 1. Компилятор не ругается, программа выполняется. 🙂

    Может быть свежие компиляторы научились боротся с этой ошибкой…
    СPP v.11, QT 5.12, MinGW(64bit)

    1. Александр:

      Так в задании код корректный. Его нужно "доработать напильником" в другой стиль.

      Пустой конструктор нужен просто как инструкция компилятору. Без пустого конструктора попытка создать объект без параметров невозможна. При этом сам конструктор вовсе не обязательно что-то должен делать.

      Такие ситуации случаются и без танцев с инициализацией. Например, обычно нужно создавать объекты не беспокоясь о начальных значениях, но все-таки создан конструктор с возможностью задать некоторые значения. Как только мы создаем такой конструктор, создавать объекты без параметров становится невозможно. Так как нас начальные значения не беспокоят, то нужно создать пустой конструктор, который ничего не делает, но показывает компилятору, что "ничего не делать — это фича, а не баг"

  3. Sun Serega:

    А когда будет template? Сколько всего уроков планируется?

    1. Li4ik Li4ik:

      Для Шаблонов есть отдельная глава. Но еще до той главы уроков 50. Всего еще уроков около 90 осталось перевести.

  4. Герман:

    С нетерпением ждем новых уроков!!!!!!!

  5. Герман:

    Это, наверное, лучший курс по обучению программированию, что мне встречался в сети! Автору респект!

    1. Li4ik Li4ik:

      Спасибо, буду продолжать 🙂

Добавить комментарий

Ваш E-mail не будет опубликован. Обязательные поля помечены *