Страницы

Поиск по вопросам

среда, 27 ноября 2019 г.

Вызов конструктора без скобок

#c++


У меня родился вопрос по мотивам вот этого вопроса а точнее комментариев к ним.

Итак вопрос: в чем разница между new T и new T()?
    


Ответы

Ответ 1



Смотрите. new T — это default initialization. При этом происходит следующее: для класса T вызывается конструктор по умолчанию (то есть, конструктор без параметров или конструктор с параметрами, который может быть вызван без параметров т. к. все аргументы имеют значение по умолчанию) для массива T ко всем элементам массива рекурсивно применяется default initialization для остальных T (например, простых типов), ничего не происходит, значение не определено. new T() — это value initialization. Оно работает так: если T — класс, и у него есть хоть один явно определённый конструктор, то вызывается конструктор по умолчанию (см. выше). если T — класс, но не union, и у него нету явно определённых конструкторов, то у него есть автоматически созданный конструктор по умолчанию. Объект сначала подвергается нулевой инициализации (в большинстве случаев, но не всегда, просто память прописывается нулями), а затем вызывается конструктор по умолчанию. если T — массив, ко всем элементам массива рекурсивно применяется value initialization в остальных случаях (например, если T — простой тип), он подвергается нулевой инициализации. Пример: int* p1 = new int; int* p2 = new int(); Здесь значение *p1 не определено, а значение *p2 гарантированно 0. Для полноты: new T(arg) — это direct initialization. Происходит следующее: если T — класс, рассматриваются все конструкторы и вызывается наиболее подходящий иначе T должен быть простым типом, и значение arg приводится к типу T (используя, если нужно, неявные преобразования), и результат будет значением объекта. Заметьте, что в этом случае для классов нулевая инициализация не выполняется, в отличие от случая без параметров, но со скобками.

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

Отправить комментарий