Добавил:
Помощь с лабораторными, контрольными практическими и курсовыми работами по: - Инженерной и компьютерной графике - Прикладной механике Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
2 сем 1 курс С++ / Экзамен / Lektsii_Kurakina_2_semestr.pdf
Скачиваний:
6
Добавлен:
08.08.2022
Размер:
4.82 Mб
Скачать

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

Перегрузка операции выполняется с помощью определения операторной функции следующего формата:

<тип> operator <операция> (список параметров)

{операторы тела функции;}

Функция операции должна быть или членом класса, или дружественной функцией.

В случае внешнего определения (за рамками класса) операция функции примет следующий формат:

<тип> класс::operator <операция> (список параметров)

{операторы тела функции;}

Не могут быть переопределены или перегружены:

1.операция условия «?:»

2.уточнение области видимости «::»

3.Точка «.»

3. sizeof

Перегруженная операция не может иметь параметров с умолчаниями.

4.6 Перегрузка операций сложения и присваивания

C++ позволяет расширить область применимости этих операций, например, для сложения векторов в трёхмерном пространстве. Для этого нужно определить новое поведение стандартной операции “+” применительно к новым типам данных. Это допускается, если хотя бы один из операндов операции является объектом определённого пользователем класса.

Пример: реализовать перегрузку операций сложения и присваивания относительно класса vector

#include <iostream>

using namespace std;

class vector {

int x,y,z;

public:

vector operator+(vector t);

vector operator = (vector t); void show(void);

void assign (int mx, int my, int mz);}; vector vector :: operator + (vector t)

{vector temp; temp.x=x+t.x; temp.y=y+t.y; temp.z=z+t.z; return temp;}

vector vector :: operator=(vector t) {x=t.x;

y=t.y;

z=t.z;

return *this;}

void vector :: show(void) {cout <<x<<y<<z<<"\n";}

void vector :: assign (int mx, int my, int mz) {x=mx;

y=my;

z=mz;} main (void)

{vector a,b,c; a.assign(1,2,3); b.assign(10,10,10); c=a+b;

c.show();

c=a+b+c;

c.show();

c=b=a;

b.show();

c.show();

}

Каждая из функций операции имеет только один параметр, в то время как сами функции определяют бинарные операции. Другой аргумент неявно передаётся с this-указателем. Здесь this ассоциируется с объектом, предшествующим знаку операции. Если используются функции-члены, то не нужны параметры для унарных операций, и требуется лишь один параметр для бинарных операций.

Возвращаемое значение имеет тип vector. Это позволяет использовать выражения типа

a+b+c

либо

c=b=a.

Операция сложения не изменяет своих операндов; операция присваивания модифицирует операнд, стоящий слева.

4.7 Перегрузка операций ++ и --

Подобным образом можно перегрузить ++ и -- : vector vector :: operator ++ (void)

{x++;

y++;

z++;

return *this;}

Чтобы отличить префиксную операцию от постфиксной, в постфиксной добавляют фиктивный целочисленный указатель при описании функции операции:

vector vector :: operator++(int)

{vector tmp;

tmp=*this;

x++;

y++;

z++;

return tmp;}

Значение координат увеличивается, но возвращается старое значение объектов.

4.8 Дружественные функции-операции

Отличие использования дружественных функций-операций состоит в том, что нельзя использовать скрытый указатель this.

Для бинарных операций должны передаваться два аргумента, для унарных – один аргумент.

#include <iostream> using namespace std; class vector {

int x,y,z; public:

friend vector operator+(vector t1, vector t2); friend vector operator ++ (vector &t); vector operator = (vector t);

void show(void);

void assign (int mx, int my, int mz);}; vector operator+(vector t1, vector t2) {vector tmp;

tmp.x=t1.x+t2.x;

tmp.y=t1.x+t2.y;

tmp.z=t1.x+t2.z; return tmp;}

vector vector :: operator=(vector t) {x=t.x;

y=t.y;

z=t.z;

return *this;}

void vector :: show(void)

{cout <<x<<y<<z<<"\n";}

void vector :: assign (int mx, int my, int mz)

{x=mx;

y=my;

z=mz;}

main (void)

{vector a,b,c;

a.assign(1,2,3);

b.assign(10,10,10);

c=a+b;

++c;

c.show();

c=a+b+c;

c.show();

c=b=a;

b.show();

c.show();

}

Перегрузку операции умножения объекта типа vector на целое можно записать и функцией-членом и дружественной функцией. Операцию умножения целого

на vector можно определить только через дружественную функцию.

Перегрузка унарных операций

Перегрузка унарных операций при помощи дружественной функции требует использования ссылки.

vector operator++ (vector &t)

{t.x++;

t.y++;

t.z++;

return t;}

Соседние файлы в папке Экзамен