Перегрузка операторов ввода-вывода

Перегрузка оператора вывода в поток <<

При помощи перегрузки операторов можно добиться того, чтобы ввод-вывод значений объектов через потоки можно было использовать при помощи стандартных в этом случае операторов "<<" и ">>".

Перегрузить можно оператор вывода в поток ostream, что позволит использовать экземпляры класса в строке потока вывода с таким же синтаксисом, как и для встроенных типов.

При этом в качестве левого операнда оператор << должен иметь неконстантную ссылку на поток ostream, а значит данный оператор всегда определяется внешней функцией, а не методом класса.

В качестве результата следует возвращать исходную ссылку на поток.

Пример перегрузки оператора <<

class Integer
{
 private:
    int m_value;
 
 public:
    Integer(int i = 0) {
        m_value = i;
    }

    int value() {
        return m_value;
    }
};

ostream& operator<<(ostream &out, Integer i)
{
    out << i.value();
    return out;
}

int main()
{
    ofstream fout("output.txt");
    Integer a(123), b(456);
    fout << b + c << endl;
    return 0;
}

Перегрузка оператора чтения из потока >>

Можно перегрузить оператор чтения из потока istream.

При этом в качестве левого операнда оператор >> должен иметь неконстантную ссылку на поток istream, а значит данный оператор всегда определяется внешней функцией, а не методом класса. Кроме того функция должна быть объявлена дружественной, чтобы иметь возможность модификации объекта.

В качестве результата следует возвращать исходную ссылку на поток.

Пример перегрузки оператора >>

class Integer
{
 private:
    int m_value;
 
 public:
    Integer(int i = 0) {
        m_value = i;
    }

    int value() {
        return m_value;
    }

    friend istream& operator>>(istream &, Integer&);
};

istream& operator>>(istream &in, Integer& i)
{
    in >> i.m_value;
    return in;
}

int main()
{
    ifstream fin("input.txt");
    Integer a;
    fin >> a;
    cout << a.value() << endl;
    return 0;
}