Явный вызов конструктора по умолчанию [закрыт]

112
22 июня 2019, 07:20

Что это такое? Может ли кто-нибудь привести пример? Решение через указатель не подходит.

Answer 1

Формально, язык С++ вообще не предоставляет вам средств для явного вызова конструктора. Вызов конструктора - это всегда побочный эффект процесса инициализации. Вы, как пользователь, можете лишь инициировать процесс инициализации. Это процесс будет проходить по довольно разветвленной системе правил. И в каких-то ветках этой системы правил он может вылиться в вызов конструктора. А может и не вылиться. Управлять этим вы можете лишь косвенно - предоставляя в своем классе те или иные конструкторы и указывая тот или иной инициализатор. Средств прямого вызова конструктора в языке нет. Это относится ко всем конструкторам, в т.ч. к конструктору по умолчанию.

Наверное, единственный контекст, который можно назвать отдаленно приближающимся к "вызову конструктора" - это делегация из одного конструктора в другой в С++11... Однако нет: согласно спецификации языка, делегация конструкторов работает по общим правилам инициализации. Что, кстати, дает нам еще один баг GCC. Вот в таком коде

#include <iostream>
struct S
{
  int x;
  S() = default;
  S(const char *) : S() {}
};
int main() 
{
  S s("abba");
  std::cout << s.x << std::endl;
}

GCC не инициализирует s.x нулем. Clang и MSVC работают правильно. Смена инициализатора с () на {} приводит к инициализации нулем и в GCC тоже.

READ ALSO
Ошибка с массивом error: invalid conversion from &#39;int&#39; to &#39;int*&#39;

Ошибка с массивом error: invalid conversion from 'int' to 'int*'

Ошибку ловлю на строке 'int *mass1= ArrayGenerate(raz);':

127
Не правильно работает структура

Не правильно работает структура

У меня есть класс, но программа вылетает после создания объекта его типа

121
Как в OpenGL нарисовать дугу?

Как в OpenGL нарисовать дугу?

Как в opengl c++ нарисовать дугу которая начинается с определённой точки и заканчивается определённой точкой Пример - дуги которые между многоугольниками...

104