Объектно-ориентированное программирование — Правила составления перегружаемых функций и операций
- Объектно-ориентированное программирование
- Локальные и глобальные переменные
- Подпрограммы и их аргументы
- Определение данных
- Операторы динамического распределения памяти
- Перегрузка функций и операций
- Правила составления перегружаемых функций и операций
- Класс как обобщение структуры
- Определение первичного класса
- Перегрузка операций
- Конструкторы
- Список инициализации
- Деструктор
- Дружественные классы
- Статические элементы класса
- Шаблоны функций
· для перегружаемых операций (над структурами) отсутствует возможность передачи параметров по умолчанию;
· перегрузка функций не должна приводить к конфликту с параметрами, заданными по умолчанию. Например, нельзя определить две функции:
int f(int x=0);
int f();
ибо неясно, к вызову какой из этих функций приводит оператор y=f();
· перегружаемые функции и операции не могут различаться только по типу возвращаемого значения, например, объявление функций:
Void f(int);
int f(int);
является ошибочным.
Пример. Рассмотрим структуру, реализующую двумерный вектор. Определим для него операции суммы, разности, унарного минуса, скалярного произведения.
#include //библиотека стандартного ввода-вывода
struct Vector { //структура вектора на плоскости
double x,y; //состоит из координат х и у
};
Vector operator+(Vector v, Vector w) //перегрузим операцию сложения
{
Vector t;
t.x=v.x+w.x; t.y=v.y+w.y; //складываются соответствующие координаты
//двух векторов
return t;
}
Vector operator-(Vector v, Vector w) //перегрузим операцию вычитания
{
Vector t;
t.x=v.x-w.x; t.y=v.y-w.y; //находится разность соответствующих
//координат двух векторов
return t;
}
Vector operator-(Vector v) //перегрузим операцию унарного минуса
{
Vector t;
t.x=-v.x; t.y=-v.y; //найдём вектор,противоположно направленный
//и имеющий ту же длину, для данного
return t;
}
double operator*(Vector v, Vector w) //перегрузим операцию умножения
{
return v.x*w.x+v.y*w.y;//найдём скалярное произведение двух векторов
}
int main()
{
Vector a={1,0}, b={-1,1},c,d,e;
printf ("\nВходные данные:\n");
printf ("Вектор а={%f,%f},b={%f,%f}\n",a.x,a.y,b.x,b.y);
c=a-b;
printf("\nРезультат вычитания a-b={%f,%f}",c.x,c.y); //вычитание
printf("\nРезультат скалярного произведения a*b=%f",a*b);
//произведение
d=a+b;
printf("\nРезультат сложения a+b={%f,%f}",d.x,d.y); //сложение
e=-a ;
printf("\nВектор противоположный а это вектор е={%f,%f}",e.x,e.y);
//унарный минус
}
Результаты работы программы
Входные данные:
Вектор а={1.000000,0.000000},b={-1.000000,1.000000}
Выходные данные:
Результат вычитания a-b={2.000000,-1.000000}
Результат скалярного произведения a*b=-1.000000
Результат сложения a+b={0.000000,1.000000}
Вектор противоположный а это вектор е={-1.000000,-0.000000}