Есть ли конструктор у базовых типов?

238
15 июля 2022, 21:00

Есть ли конструктор у базовых типов, например int?

Answer 1

В C++ конструкторы и деструкторы имеют только классовые типы.
Остальные типы не имеют ни конструкторов, ни деструкторов. Но синтаксис языка, вкупе с правилами инициализации, позволяют использовать идентичные (или почти идентичные) конструкции инициализации как для классовых, так и для не классовых типов. Например, имеется такой синтаксис инициализации:

int x(10);//кажется, что это создание int с вызовом конструктора

Но в C++ для классовых и не классовых типов прописаны разные правила инициализации при одинаковом синтаксисе, приводящие к похожим результатам. Просто представьте, что такой синтаксис бы отсутствовал. Возьмем шаблон:

template<typename T>
void foo(T obj) {
   T obj2(obj1);
}
//...
foo(std::string(""));//ok
foo(10);//ошибка

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

using Int = int; int main(){ Int a = 1; a.~Int(); }

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

P.S. Не всё что плавает и крякает является уткой, и это очень хорошо показано в фильме "Особенности национальной охоты".

Answer 2

Да. Но не в обычном понимании. У базовых типов в С++ есть тривиальные конструкторы по умолчанию, которые нельзя изменить.

Конструктор в обычном понимании (которые может определить программист) представляет из себя функцию-член для какого-либо класса. int и прочие базовые типы являются POD-типами (Plain Old Data - простая структура данных). Здесь можно узнать больше про POD-типы: POD типы в C++.

Относительно тривиальных конструктов - они описываются в этой статье на cpprefernce.com, в разделе, посвященном тривиальным конструкторам (Trivial constructor): Default constructors. В частности, упоминается следующее (приведу перевод с английской версии, потому что русская версия cppreference очень сырая):

Конструктор является тривиальным если соблюдаются следующие условия:

  • Конструктор не определяется пользователем (т.е. он неявно определяется компилятором)

Тривиальным конструктором по умолчанию является конструктор, который не выполняет никаких действий. Все типы данных, совместимые с языком C (POD типов) имеют тривиальный конструктор по умолчанию.

Также в книге Бьярна Страуструпа "Принципы и практика с использованием C++" в главе 9 (посвященной конструкторам) упоминается наличие у базовых классов конструкторов по умолчанию.

READ ALSO
Как получить больше данных на onion-сайте в TOR?

Как получить больше данных на onion-сайте в TOR?

Создал onion-сайт, но переменная $_SERVER не отображает ничего полезногоМне кажется, можно как-то получить информацию о цепочке, её IP и т

212
Регулярное выражение для валидации имени пользователя

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

Подскажите, пожалуйста, как должно выглядеть регулярное выражение для проверки имени пользователя, которое не должно начинаться с цифры...

227
Как сменить формат даты при отправке ajax?

Как сменить формат даты при отправке ajax?

Всем привет! Как при отправке ajax запроса, либо при его получении обработчиком изменить формат даты? input type="date" принимает дату в формате...

215
grpc забсрок к докеру

grpc забсрок к докеру

Привет всем у меня есть dockerfile

326