Инициализация по умолчанию в C++ и инициализация значения: который есть какой, который вызывается, когда и как надежно инициализировать элемент типа шаблона
Мой вопрос несколько совпадает с этим и несколькими другими подобными. У них есть отличные ответы, но я их прочитал и все еще растерялся, поэтому, пожалуйста, не считайте этот вопрос дубликатом.
Итак, у меня есть следующий код:
class A {
public: int _a;
}
void main()
{
A inst1;
A* inst2 = new A;
A* inst3 = new A();
}
_a
остается неинициализированным в inst1
а также inst2
и инициализируется 0
в inst3
, Какая инициализация называется какой, и почему код работает так, как работает? Пожалуйста, примите во внимание, что у меня нет под рукой стандарта C++ 03, но у меня есть последний проект C++ 11 (хотя я программирую по стандарту '03), поэтому цитаты из стандарта '03 или ссылки на '11 приветствуются.
PS Первоначальная задача этого исследования состояла в том, чтобы правильно зето-инициализировать элемент произвольного типа шаблона T
,
2 ответа
Не так сложно
A x;
A * p = new A;
Эти два являются инициализацией по умолчанию. Поскольку у вас нет пользовательского конструктора, это просто означает, что все члены инициализируются по умолчанию. Инициализация по умолчанию основного типа, такого как int
означает "нет инициализации".
Следующий:
A * p = new A();
Это инициализация значения. (Я не думаю, что существует автоматическая версия этого в C++98/03, хотя в C++11 вы можете сказать, A x{};
и эта фигурная инициализация становится инициализацией значения. Более того, A x = A();
достаточно близко практически несмотря на то, что инициализация копирования, или A x((A()))
несмотря на прямую инициализацию.)
Опять же, в вашем случае это просто означает, что все члены инициализированы значением. Инициализация значения для фундаментальных типов означает нулевую инициализацию, что, в свою очередь, означает, что переменные инициализируются в ноль (что есть во всех фундаментальных типах).
Для объектов типа класса инициализация по умолчанию и инициализация значения вызывают конструктор по умолчанию. Что происходит затем, зависит от списка инициализатора конструктора, и игра продолжается рекурсивно для переменных-членов.
Да, A inst4 ();
рассматривается как объявление функции. std::string str();
должно быть таким же (т.е. я думаю, что вы ошибочно думали, что это сработало).
Видимо ( отсюда), C++03 будет иметь inst3._a
быть 0, но C++98 оставил бы его неинициализированным.