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

  Юрий  | 

  |

  Обновл. 13 Сен 2021  | 

 58017

 ǀ   14 

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

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

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

length: 3.5 and width: 3.5

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

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

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

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

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

length: 4.5 and width: 5.5

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

Тест

Задание №1

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

Результат выполнения программы должен быть следующим:

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

Ответ №1

Задание №2

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

Ответ №2

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


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

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

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

  1. Алексей:

    Вроде сделал, смотрю — по-умолчанию то нету инициализации, а потом смотрю а записал то иначе.

    Упустил, ведь это вызывает загромождение.
    Тут ладно, в большой программе — нет.

    Но все равно, успехи на лицо. Уверенно и лаконично.

    Спасибо за курс!

    1. Владимир:

      По-моему в вашей реализации чтобы поменять в выводе например blue на green надо конструкторы править в двух местах, а у автора в одном. В сокращении кол-ва правок и есть смысл задания.

    2. Fantasy:

      Либо я чего-то не понимаю либо в вашем коде в строке

      const std::string &color абсолютно бесполезно ставить конст. Для чего он нужен? Если бы в привате было всё константными значениями тогда список инициализации зашёл бы хорошо. Но я голову ломаю в смысле написания константного аргумента если если он будет буквально константным на время жизни в две строки. Суть в том чтоб обьяснить смысл список инициализации так смысл задания был не нагружать безсмысленным кодом прогу а облегчить её 

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

    Спасибо! Долгие лета!

    1. Фото аватара Юрий:

      И тебе друг!

  3. kmish:

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

    1. Павел:

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

  4. Andrey:

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

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

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

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

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

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

  5. Sun Serega:

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

    1. Фото аватара Юрий:

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

  6. Герман:

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

  7. Герман:

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

    1. Фото аватара Юрий:

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

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

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