Я знаю, что инициализация по умолчанию для не-POD-типов также будет инициализироваться по умолчанию для нестатических не-POD-переменных, вызвав их конструктор по умолчанию. Но я точно не знаю, как это происходит. Вот пример того, что я имею в виду:Смутно, как пустой конструктор, определенный пользователем, инициализирует нестатические переменные-члены, не являющиеся POD.
#include <iostream>
#include <vector>
using namespace std;
class Test2 {
public:
Test2() {cout <<"Here";}
};
class Test {
public:
Test() {}
Test2 i;
};
int main() {
Test foo;
}
Выход:
Here
Основываясь на C++ стандарта на инициализаторах (8,5), для инициализации по умолчанию:
— if T is a non-POD class type (clause 9), the default constructor
for T is called (and the initialization is ill-formed if T has no
accessible default constructor);
Так учитывая это, я ожидаю, что конструктор по умолчанию Test()
будет вызван, но мой пустой конструктор по умолчанию для класса Test
не инициализирует Test2 i
expli citly, но ясно, Test2()
получает вызов как-то неявно. Мне интересно, как это происходит?
Аналогично, для инициализации значения (не относящегося к примеру выше), если пустой пользовательский конструктор по умолчанию явно не инициализирует нестационарную переменную-член POD, как эта переменная получает нулевой инициализацию (что я знаю, что она делать)? Поскольку, основываясь на стандарте, кажется, что для инициализации значения все, что происходит, когда у вас есть пользовательский конструктор по умолчанию, заключается в том, что конструктор получает вызов.
Соответствующая часть стандарта C++ для инициализации значений заключается в следующем:
— if T is a class type (clause 9) with a user-declared constructor (12.1), then the
default constructor for T is called (and the initialization is ill-formed if T has no
accessible default constructor);
Этот вопрос похож на c++ empty constructor and member initialization Но разница в том, что вместо того, чтобы спросить, что поведение конечного результата, я бы как знать, почему происходит поведение конечного результата.
компилятора написано следовать правилам, как скомпонованные из стандарта. стандарт говорит X должен произойти в ситуации Y, поэтому компилятор испускает код для выполнения X в ситуации Y. Я не понимаю, как это может сбивать с толку. –
, если вы не инициализируете его в конструкторе, его инициализировали для ou –
@Benjamin: Моя путаница в том, что я вижу, что X должен произойти в ситуации Y с побочными эффектами, где побочные эффекты не объясняются стандартом, который я перечислял выше. – user1082160