Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Давно заметил, что всё-таки языки С/C++ это не самый лучший вариант программирования под Windows. Сейчас появилась масса более современных и удобных языков, например тот же Python - кроссплатформенный язык, очень легок в изучение. Я его изучил буквально за несколько дней по этому курсу - ссылка. Автор постарался, там видеоуроки на удивление легкие и понятные.

Основы 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;
 
 ...


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS