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 руб./мес


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




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

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

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

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

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