Объект-указатель, вызывающий конструктор, дает другой, не ожидаемый результат - PullRequest
0 голосов
/ 06 августа 2020
#include <iostream>
using namespace std;


class Test 
{
    public:
  int x;
  
  Test() { x = 5;}
};
 
int main()
{
   Test *t;

   cout << t->x;

}

Он должен напечатать «5», но вместо этого он напечатает «1528349827». Test * t должен инициализировать x значением 5. и t-> x должен печатать 5. Но он дает указанное выше число. Может кто-нибудь объяснить мне, что происходит.

1 Ответ

2 голосов
/ 06 августа 2020

Test *t; должно инициализировать x значением 5.

Это ложь. Эта строка кода просто объявляет указатель на Test. Нет объекта Test, поэтому не запускается конструктор, который инициализирует любые x значением 5.

Выполнение t->x является неопределенным поведением, потому что нет объекта для разыменования. Программа может делать что угодно, в том числе выводить значение мусора.

Чтобы указать t на объект Test, вам нужно выделить память или указать на существующий объект Test:

Test *t = new Test{};
// or
Test a;
Test *t = &a;

и теперь выполнение t->x гарантированно даст значение 5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...