Рассмотрим следующий класс C++:
struct Point
{
int x;
int y;
explicit Point() =default; // 1
explicit Point(int x_, int y_): x(x_), y(y_) { } // 2
};
Второй конструктор полезен для создания Point
с определенными значениями x
и y
. Первый существует, так что я могу по умолчанию построить Point
. Однако для эффективности он имеет значение default
ed и не устанавливает x
и y
равными нулю. Если бы я действительно хотел установить все элементы равными нулю, я мог бы иметь другой конструктор:
explicit Point(int val) : x(val), y(val) { } // 3
Таким образом, я могу либо инициализировать Point
по умолчанию, либо инициализировать его, установив для всех элементов нулевое значение:
Point p1; // Don't initialize members.
Point p2(0); // Initialize all members to zero.
Проблема с третьим конструктором заключается в том, что я действительно могу передать любое значение, а не только ноль. Например:
Point p(1); // Both x and y set to 1! Is this the intent? If so,
// probably should have used Point p(1, 1) instead.
Другим способом было бы иметь специальный тип, который представляет нулевое значение или значение по умолчанию, и передать его конструктору:
explicit Point(Default) : x(0), y(0) { } // 4
Где Default
можно определить просто как:
struct Default { };
Затем я могу контролировать, когда я хочу, чтобы Point
был инициализирован значениями по умолчанию:
Point p1; // Don't initialize members.
Point p2(Default()); // Initialize members with default values.
Какой метод будет считаться лучше: метод с контрольным типом Default
(№ 4) или конструктор, который принимает одно значение и инициализирует все элементы этим значением (№ 3)? Каковы плюсы/минусы двух методов? Или есть другой лучший механизм для этого?
Изменить: обратите внимание, что этот простой класс был выбран для иллюстрации; на самом деле может быть гораздо больше членов, которым нужны определенные значения по умолчанию, чтобы считаться "инициализированными".
Point p{};
. - person juanchopanza   schedule 04.12.2016