@ Джимми: хороший обратный звонок
чание: Я использую компилятор g ++ (который, как я слышал, довольно хорош и должен быть довольно близок к стандарту).
У меня есть самый простой класс, который я мог придумать:
class BaseClass {
public:
int pub;
};
Тогда у меня есть три одинаково простые программы для созданияBaseClass
объект (ы) и распечатайте [неинициализированное] значение их данных.
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
Это распечатывает:
B1.pub = 1629556548
Что хорошо. Я действительно думал, что он будет инициализирован до нуля, потому что это POD или Plain Old Datatype или что-то в этом роде, но я не думаю, что? Все идет нормально.
Дело 2BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;
Это распечатывает:
B1.pub = 1629556548
B2.pub = 0
Это определенно странно. Я создал два одинаковых объекта одинаково точно. Один был инициализирован, а другой нет.
Дело 3BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;
BaseClass* pB3 = new BaseClass;
cout<<"B3.pub = "<<pB3->pub<<endl;
Это распечатывает:
B1.pub = 0
B2.pub = 0
B3.pub = 0
Это самое странное пока. Все они инициализируются до нуля. Все, что я сделал, это добавил две строки кода, и это изменило предыдущее поведение.
Так это просто случай «неинициализированных данных приводит к неопределенному поведению» или что-то более логичное происходит «под капотом»?
Я действительно хочу понять поведение конструктора / деструктора по умолчанию, потому что у меня есть ощущение, что это будет очень важно для полного понимания вещей наследования.