C++ - Копировать конструктор с указателями в качестве поля данных

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

#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

1 ответ

Решение
cout << a.get() << b.get() ;

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

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

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

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

cout << a.get();
cout << b.get();
Другие вопросы по тегам