@ Джимми: хороший обратный звонок

чание: Я использую компилятор g ++ (который, как я слышал, довольно хорош и должен быть довольно близок к стандарту).

У меня есть самый простой класс, который я мог придумать:

class BaseClass  {
  public:
    int pub;
};

Тогда у меня есть три одинаково простые программы для созданияBaseClass объект (ы) и распечатайте [неинициализированное] значение их данных.

Дело 1
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;

Это распечатывает:

B1.pub = 1629556548

Что хорошо. Я действительно думал, что он будет инициализирован до нуля, потому что это POD или Plain Old Datatype или что-то в этом роде, но я не думаю, что? Все идет нормально.

Дело 2
BaseClass B1;
cout<<"B1.pub = "<<B1.pub<<endl;
BaseClass B2;
cout<<"B2.pub = "<<B2.pub<<endl;

Это распечатывает:

B1.pub = 1629556548
B2.pub = 0

Это определенно странно. Я создал два одинаковых объекта одинаково точно. Один был инициализирован, а другой нет.

Дело 3
BaseClass 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

Это самое странное пока. Все они инициализируются до нуля. Все, что я сделал, это добавил две строки кода, и это изменило предыдущее поведение.

Так это просто случай «неинициализированных данных приводит к неопределенному поведению» или что-то более логичное происходит «под капотом»?

Я действительно хочу понять поведение конструктора / деструктора по умолчанию, потому что у меня есть ощущение, что это будет очень важно для полного понимания вещей наследования.

Ответы на вопрос(7)

Ваш ответ на вопрос