Наличие конструктора по умолчанию является необязательным, но в некоторых ситуациях он часто использует ваш класс. Если вы не указали любые конструкторы, тогда компилятор будет генерировать для вас конструктор по умолчанию, который эквивалентен вам с пустым списком инициализаторов и пустым телом функции.
При реализации конструктора по умолчанию обычно лучше сделать его максимально эффективным, так как часто конструктор по умолчанию не используется и не перезаписывается. Например. Потоковая передача: T t; std::cin >> t;
или создание фиксированного массива вещей, которые нужно переустановить позже T arr[100];
. По этой причине, хотя может показаться очевидным, чтобы конструктор по умолчанию установил DateTime
на «сейчас», если это связано с системным вызовом или другой дорогостоящей операцией, чтобы узнать текущую дату, обычно лучше не делать этого для конструктора по умолчанию ,
Если у вас не были конструкторов на всех, то есть много ситуаций, когда значение инициализации будет вызывать все ваши члены должны быть инициализированы в любом случае, например:
// Explicit value-initialzation of dynamcially allocated DateTime
DateTime* pdt = new DateTime();
// Value-initialized temporary
FunctionTakesDateTime(DateTime());
// Copy-initalization from a value-initialized temporary
DateTime dt = DateTime();
Если вы указали конструктор по умолчанию но явно не инициализировали все члены класса, и эти члены были POD-типа (например, time_t
и int
), тогда эти члены теперь останутся неинициализированными. Чтобы получить такой же эффект для инициализации значения, как если бы у вас не было объявленных пользователем конструкторов, вам нужно было бы явно инициализировать все ваши члены в вашем конструкторе по умолчанию.
DateTime() : ticks(), days(), months() /*, ... */ {}
Это была бы моя предпочтительная реализация конструктора по умолчанию. Это означает, что построение по умолчанию по-прежнему довольно дешево, но по умолчанию const 0ed DateTime
s все еще имеют четко определенное и легко узнаваемое значение для целей отладки и диагностики.
В то время как у вас может быть значение initialized
boolean, позволяющее иметь «отложенную конструкцию», я бы не рекомендовал его. Это добавляет много накладных расходов для всего остального класса дизайна с тем, что, вероятно, будет очень мало выгоды. Если клиент хочет манипулировать DateTime
с нестандартными значениями, то он должен быть до клиента, чтобы инициализировать их по мере необходимости.
Ну, как я понимаю, если я не укажу по умолчанию, компилятор создает для меня один, который, как я понимаю, в основном плохой. –
В некоторых случаях требуется конструктор по умолчанию. Например, если вы хотите иметь вектор объектов DateTime. –
Или это, только если нет других объявленных конструкторов, по умолчанию или нет? –