C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 Урок 18. Перегружаем << и >> / Основы Visual C++ / Visual C++

Основы Visual C++
Урок 18. Перегружаем << и >>

На этом уроке мы с вами посмотрим, как можно перегрузить операции << и >>. Когда мы сделаем это, то для экземпляров нашего класса мы сможем писать что-то вроде

...
cout<<z<<y;
...

и

...
cin>>z>>y;
...

Сделаем мы это на примере класса CVector, которым мы занимались на прошлых уроках.

Для начала перегрузим операцию <<. Прежде всего добавьте в наш файл еще один include:

#include <fstream.h>
...

На нам нужен для для того, чтобы перегрузка была для любого потока (т. е. после наших действий мы сможем делать вывод не только на экран, но и в файл).

Затем добавьте функцию со следующей реализацией:

ostream & operator<< (ostream &str, CVector v){
    str<<"("<<v.m_x<<", "<<v.m_y<<")";
    return str;
}

И, наконец, наш класс CVector должен объявить нашу функцию своим другом (ведь она же обращается к закрытым переменным этого класса!):

class CVector{
    ...
public:
    ...
    friend ostream & operator<< (ostream &srt, CVector v);
};

Теперь в функции main() мы можем написать что-то вроде

void main(){
    CVector z(2,4);
    cout<<z;
    cout<<"\n";
}

и оно будет работать - при запуске программа покажет вектор z:

Результат выполнения программы

А вот как можно перегрузить оператор >>:

istream & operator>> (istream &str, CVector &v){
    str>>v.m_x>>v.m_y;
    return str;
}

Класс CVector должен и его объявить своим другом:

class CVector{
    ...
public:
    ...
    friend istream & operator>> (istream &str, CVector &v);
};

Для испытания измените функцию main() следующим образом:

void main(){
    CVector z;
    cin>>z;
    cout<<z;
    cout<<"\n";
}

Теперь при запуске что вы введете с клавиатуры, то вы и получите на экране:

Результат выполнения программы

Кратко обсудим теперь наш код. Существует два потока - istream (для ввода данных в программу) и ostream (для вывода данных из программы). Их мы берем в качестве параметров функции по ссылке (т. е. приписываем знак &). Если забыли, что такое взятие по ссылке, то смотрите урок 13. Так мы делаем потому, что наши потоки изменяются.

Также обратите внимание, что второй параметр (типа CVector) в одном случае мы берем по ссылке, а в другом - по значению. По ссылке мы берем для перегруженной операции >>. Причина в том, что в этом случае значение параметра изменяется - мы записываем что-то в наш вектор с клавиатуры (или из файла). Для другой же перегружаемой операции (<<) наш второй параметр мы берем по значению. Здесь мы поступаем так потому, что значение нашего вектора тут не меняется. Он просто отправляется на экран или в файл, а сам остается неизменным.

Теперь пару слов о типе возвращаемого значеия. И для перегруженного <<, и для перегруженного >> тип возвращаемого значения должен совпадать с типом левого операнда. Этот тип - ostream & для << и istream & для >>. Почему тип возврашаемого значения должен совпадать с типом левого операнда? Для того, чтобы были возможны конструкции с двумя переменными типа

...
CVector z, y;
cin>>z>>y;
cout<<z<<y;
...

Абсолтно аналогично и для обычных переменных типа int:

...
int k, n;
cin>>k>>n;
cout<<k<<n;
...