Что это значит в конструкторе?

struct Node {
  string val;
  Node* next;
  Node(string _val) : val(_val), next(nullptr){}
};

что тут в конструкторе означает эта часть: : val(_val), next(nullptr)???


Ответы (1 шт):

Автор решения: gbg
  1. Что это такое?

Это вызов конструкторов/инициализаторов для полей класса. Выполняется во время создания экземпляра класса. Конструкторы будут вызваны в том порядке, в каком создаются поля, а не в том порядке, в каком они перечислены здесь. Это важно, если при создании имеются зависимости между полями.

  1. Зачем это? Ведь я могу просто присвоить нужные значения в теле конструктора?
  • Это расточительно. Некоторые объекты создаются и удаляются заметное количество времени, кроме того, если следовать принципам RAII, такое избыточное создание-удаление может создать неоправданную нагрузку на ресурсы.
  • Некоторые поля нужно обязательно присвоить прямо при создании. В частности, речь идет о константах и ссылках. Без такого синтаксиса иметь такие поля было бы невозможно.
  1. Когда этим пользоваться?

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

→ Ссылка