Инициализация по умолчанию в 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 оставил бы его неинициализированным.

Другие вопросы по тегам