Как программа «запоминает» временный объект? - PullRequest
0 голосов
/ 06 февраля 2020
#include <iostream>
using namespace std;
class A {
public:
    int first;
    int last;
    A(int x = 0, int y = 0):first(x), last(y){}
    A(A&a) { cout << "c ctor \n"; }
};
ostream& operator<<(ostream& os, A b) {
    os << "first:" << b.first << "  last:" << b.last << endl;
    return os;
}
istream& operator>>(istream& is, A a) {
    is >> a.first >> a.last;
    return is;
}
int main()
{
    A i;
    cout << "enter first and last: \n";
    cin >> i;
    cout << i;
    system("pause");
    return 0;
}

A a - это новый объект A в перегрузке >>, и если мы введем в него значение 6 4, программа запомнит его в функции << overload и выведет то, что мы в него ввели. Может кто-нибудь объяснить, почему? Благодаря. </p>

1 Ответ

2 голосов
/ 07 февраля 2020

Это неверное утверждение относительно представленного вами кода, потому что оператор >> имеет дело с копией исходного объекта, используемого в качестве аргумента оператора.

Оператор должен быть объявлен как

istream& operator>>(istream& is, A &a) {
    is >> a.first >> a.last;
    return is;
}

Более того, конструктор копирования не копирует элементы данных.

Таким образом, программа имеет неопределенное поведение. Например, запустив его с помощью clang HEAD 11.0.0, вы можете получить следующий результат

prog.cc:8:9: warning: unused parameter 'a' [-Wunused-parameter]
    A(A&a) { cout << "c ctor \n"; }
        ^
1 warning generated.
enter first and last: 
c ctor 
c ctor 
first:4202496  last:0

То есть программа выводит переменные первыми и последними с неопределенными значениями, поскольку члены-данные созданного объекта b в оператор << не был инициализирован. </p>

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