§ 3. Перагрузка аперацый

3.2. Лагічны тып даных

Для стандартных тыпаў даных такіх як int або double ўвод і вывад рэалізаваны праз стандартныя аператары >> і <<. Гэтыя ж аператары перагружаныя для ўводу-вываду радкоў. Для карыстальніцкіх тыпаў даных, якія маюць мноства палёў, таксама можна перагрузіць аператары ўводу-вываду. Перагрузка аператараў < < і >> нашмат спрашчае працэс вываду аб'екта на экран і атрыманне карыстальнiцкага ўводу з запісам даных у аб'ект класа.

Разгледзім перагрузку аператара <<. Аператар з'яўляецца бінарным аператарам, таму яго перагрузка будзе аналагічная перагрузцы аператара «+», разгледжанай у прыкладах 3.5 і 3.6. Левым аперандам у аператара < < з'яўляецца аб'ект cout, а правым — аб'ект класа, які трэба вывесці. Аператар, які перавызначаецца, павінен вяртаць значэнне тыпу ostream, аб'ектам якога з'яўляецца cout. Параметры, апісанай функцыі, павінны быць спасылкамі (прыклады 3.7 i 3.8). Таксама спасылкай павінен быць і вынік, які вяртаецца, паколькі ostream забараняе сваё капіраванне.

Перагрузка аператара ўводу адбываецца аналагічна. Адрозненне ў тым, што cin з'яўляецца аб'ектам тыпу istream (прыклады 3.9 i 3.10). Спасылка на аб'ект класа, які з'яўляецца другім параметрам, не можа быць канстантай, паколькі аб'ект змяняецца пры ўводзе.

Пасля перазагрузкі аператараў уводу і вываду іх можна выкарыстоўваць таксама для чытання і запісу файлаў.

Прыклад 3.7. Перагрузка аператара вываду << для класа Vect, вызначанага ў прыкладзе 3.5.

Аб'ява:

friend ostream & operator << 

(ostream &, const Vect &);

Апісанне:

ostream & operator << 

(ostream &out, const Vect &p)

{

  out << p.<< " " << p.<< endl;

}

Прыклад 3.8. Перагрузка аператара вываду << для класа Matrix, вызначанага ў прыкладзе 3.6.

Аб'ява:

friend ostream & operator << 

(ostream &, const Matrix  &);

Апісанне:

ostream & operator << 

(ostream & out, const Matrix &d)

{

  for (int i = 0; i < d.n; i++){

    for (int j = 0; j < d.m; j++)

      out << setw(4) << d.data[i][j];

    out << endl;

  }

  out << endl;

Прыклад 3.9. Перагрузка аператара вываду >> для класа Vect, вызначанага ў прыкладзе 3.5.

Аб'ява:

friend istream & operator >> 

(istream &, Vect &);

Апісанне:

span style="font-size: medium;">istream & operator >> 
(istream &in, Vect &p)

{

    in >> p.>> p.y;

}

Прыклад 3.10. Перагрузка аператара вываду >> для класа Matrix, вызначанага ў прыкладзе 3.6

Аб'ява:

friend istream & operator >> 

(istream &, Matrix &);

Апісанне:

istream & operator >> 

(istream & in, Matrix &d)

{

  for (int i = 0; i < d.n; i++)

    for (int j = 0; j < d.m; j++)

      in >> d.data[i][j];

}