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

ВИДЕОКУРС ВЗЛОМ
выпущен 2 июля!


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

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



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

Основы Visual C++
Урок 16. Перегрузка операций

На этом уроке мы с вами посмотрим, как в C++ осуществляется перегрузка операций. Для начала несколько слов, что это такое. Рассмотрим, например, такую строку:

...
 
 a=b+c;
 
 ...

Спрашивается, есть в этой строке ошибка или нет, поймет компилятор нас или будет в этом месте ругаться. Ответ может быть и положительным, и отрицательным. Все зависит от того, к какому типу относятся a, b и c (будем для простоты считать, что все они относятся к одному типу). Если, скажем, a, b и c - переменые типа int, то, очевидно, ошибки в нашей строке нет. А если они определены как экземпляры некоторого класса:

...
 
 CMyClass a, b, c;
 
 ...

В этом случае, если мы не сделали некоторых действий, то компилятор будет на нашей строке со сложением переменных ругаться. Будет написано что-то вроде "не знаю, что означает знак + для экземпляров класса". Так вот, перегрузка операций, вынесенная в заголовок данного урока, и есть указание классу, как надо интерпретировать + (а также, разумеется, и многие остальные знаки (*, /, - и другие)) для переменных нашего класса.

Рассмотрим перегрузку операций на примере класса CVector. Экземпляры этого класса будут представлять из себя обычные векторы на плоскости. Каждый вектор будет задаваться двумя числами (x и y). После переопределения мы сможем складывать наши векторы (посредством обыкновенного плюса), вычитать (с помощью минуса), скалярно перемножать (используя знак *) и т. д.

А вот и сам код (строки, относящиеся к нашей теме, выделены полужирным шрифтом):

#include <iostream.h>
 
 class CVector{
 
     float m_x, m_y;
 
 public:
 
     CVector(){}
 
     CVector(float x, float y);
 
     CVector operator+(CVector);
 
     void print();
 
 };
 
 void main(){
 
     CVector a, b(1,2), c(3,1);
 
     a=b+c;
 
 
     a.print();
 
     cout<<"\n";
 
 }
 
 CVector::CVector(float x, float y){
 
     m_x=x;
 
     m_y=y;
 
 }
 
 CVector CVector::operator+(CVector v){
 
     CVector t;
 
     t.m_x=m_x+v.m_x;
 
     t.m_y=m_y+v.m_y;
 
     return t;
 
 }
 
 void CVector::print(){
 
     cout<<"("<<m_x<<", "<<m_y<<")";
 
 }

После компиляции и запуска наша программа должна выдать результат сложения двух векторов:

Запуск программы

Немного обсудим наш код. Если мы хотим перегрузить операцию +, то мы должны ввести в наш класс метод operator+ (разумеется, для перегрузки операции * мы должны написать operator* и т. д.). Перед операцией мы пишем тип возвращаемого значения (так как вектор плюс вектор - это опять вектор, то перед operator* пишем CVector. Теперь о параметрах. С точки зрения C++ параметр - это только то, находится справа от знака операции (плюса в нашем случае). Справа у нас находится только один вектор, следовательно у нашей операции будет только один параметр типа CVector. Таким образом объявление функции принимает следующий вид:

    ...
 
     CVector operator+(CVector);
 
     ...

Вне класса мы пишем ее реализацию (вспоминая школьный курс математики):

CVector CVector::operator+(CVector v){
 
     CVector t;
 
     t.m_x=m_x+v.m_x;
 
     t.m_y=m_y+v.m_y;
 
     return t;
 
 }

А вот как будет выглядеть переопределение операции * для скалярного умножения двух векторов (в результате такого умножения мы получим число). Сначала вводим прототип метода в наш класс:

class CVector{
 
     ...
 
 public:
 
     ...
 
     float operator*(CVector);
 
     ...
 
 };

Затем пишем реализацию нашего метода (вспомнив школьную формулу):

float CVector::operator*(CVector v){
 
     return m_x*v.m_x + m_y*v.m_y;
 
 }

Если мы теперь изменим наш main на следующий:

void main(){
 
     CVector b(1,2), c(3,1);
 
     int z;
 
     z=b*c;
 
     cout<<z<<"\n";
 
 }

, то результат работы программы будет выглядеть так:

Запуск программы

Продолжим мы тему перегрузки операций на следующем уроке.



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

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




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



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


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