Перегрузка операторов ввода / вывода в C ++ - PullRequest
0 голосов
/ 12 сентября 2018
#include <iostream>
using namespace std;

class Complex
{
private:
    int real, imag;
public:
    Complex(int r = 0, int i =0)
    {  real = r;   imag = i; }
    **friend ostream & operator << (ostream &out, const Complex &c);
    friend istream & operator >> (istream &in,  Complex &c);**
};

ostream & operator << (ostream &out, const Complex &c)
{
    out << c.real;
    out << "+i" << c.imag << endl;
    return out;
}

istream & operator >> (istream &in,  Complex &c)
{
    cout << "Enter Real Part ";
    in >> c.real;
    cout << "Enter Imagenory Part ";
    in >> c.imag;
    return in;
}

int main()
{
   Complex c1;
   cin >> c1;
   cout << "The complex object is ";
   cout << c1;
   return 0;
}

Какая польза от передачи оператора в качестве ссылки «& оператор».Когда мы передаем нормальный оператор, мы никогда не передаем ссылку, но в приведенном выше коде мы передаем ссылку оператору.Кто-нибудь может объяснить ту часть, где передается ссылка на оператора?

Ответы [ 2 ]

0 голосов
/ 12 сентября 2018

Обычно, если Объявить одно имя (только) на объявление , соблюдается правило, тогда это позволяет последовательно написать указатель / ссылку «застрял» рядом с типом как:

istream& operator>> (istream& in,  Complex& c)
{ //...

Таким образом, можно видеть, что функция с именем operator>> возвращает тип istream& (ссылка на объект istream).

Эта функция принимает 2 переменные:

  • in типа istream& (ссылка на объект istream),
  • c типа Complex& (ссылка на сложный объект).

и аналогично для:

ostream& operator<< (ostream& out, const Complex& c)
{ //...

Форматирование кода никоим образом не влияет на то, как код компилируется. Таким образом, определения функций в этом ответе точно такие же, как в вопросе.


Что касается использования ссылки, я предлагаю прочитать: Когда использовать ссылки против указателей

0 голосов
/ 12 сентября 2018

В коде friend ostream & operator << & связан с типом перегруженного оператора return. Так что он возвращает ostream & и istream & для второго.

Перегруженные операторы:

  1. Возьмите ссылку на istream или ostream объект, который является объектом ввода / вывода, например cin / cout для консольного ввода / вывода или другого типа потокового объекта (ввод / вывод из / в строку и т. Д.).
  2. Влияет на состояние объекта, чтобы данные читались / записывались.
  3. Возвращает ссылку на этот объект, чтобы вы могли использовать эти операторы в следующей последовательности:

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