Скопируйте конструктор с указателями в качестве поля данных

У меня есть следующий код: —

#include <iostream>
using namespace std;

class A {
int *val;
public:
A() { val = new int; *val = 0; }
int get() { return ++(*val); }
};

int main() {
A a,b = a;

A c,d = c;

cout << a.get() << b.get() ;
cout << endl ;

cout << c.get() << endl ;//
cout << d.get() << endl;
return 0;
}

Это производит вывод как:

21
1
2

Поведение в случае c.get и d.get легко понять.
И c, и d используют один и тот же указатель val, а a и b — один и тот же указатель val.

Поэтому c.get () должен возвращать 1, а d.get () должен возвращать 2.
Но я ожидал аналогичного поведения в a.get () и b.get (). (возможно я не правильно понял cout)

Я не могу понять, как a.get () производит 2.

Можете ли вы объяснить, почему я получаю такой вывод. По моему мнению, результат должен был быть:

12
1
2

2

Решение

cout << a.get() << b.get() ;

исполняется как:

cout.operator<<(a.get()).operator<<(b.get());

В этом выражении, будь a.get() вызывается первым или b.get() первый вызов не указан языком. Это зависит от платформы.

Вы можете разделить их на два оператора, чтобы убедиться, что они выполняются в ожидаемом порядке.

cout << a.get();
cout << b.get();
6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]