2 семестр ФИБС / Информатика / Lecture_4
.pdfПодобным образом можно перегрузить ++ и -- : vector operator ++ (void)
vector vector :: operator ++ (void) {x++;
y++;
z++;
return *this;}
Чтобы отличить префиксную операцию от постфиксной, в постфиксной добавляют фиктивный целочисленный указатель при описании функции операции:
vector vector :: operator++(int) {vector tmp;
tmp=*this;
x++;
y++;
z++; return tmp;}
Значение координат увеличивается, но возвращается старое значение объектов.
10.5 Дружественные функции-операции
Отличие состоит в том, что нельзя использовать скрытый указатель this. Для бинарных операций должны передаваться два аргумента, для
унарных – один аргумент.
# include <iostream.h> class vector (int x,y,z;
public: 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;
temp.x=t1.x+t2.x;
temp.y=t1.x+t2.y;
temp.z=t1.x+t2.z; return temp;}
Перегрузку операции умножения объекта типа vector на целое можно записать и функцией-членом и дружественной функцией. Операцию
умножения целого на vector можно определить только через дружественную функцию.
10.6 Использование ссылочных переменных
Перегрузка унарных операций
Декремент дружественной функции требует использования ссылки.
Friend vector operator ++ (vector &opl) {opl.x++;
opl. y++; opl.z++; return opl;}
Перегрузка операции индексации []
Индексация — бинарная операция, где первый операнд — объект класса, второй — целочисленный индекс. Перегрузка операции индексации позволяет работать с элементами объекта vector, как с элементами массива.
#include <iostream.h> class vector {int v[3];
public: vector(int a=0; int b=0; int c=0) {v[0]=a;
v[1]=b;
v[2]=c;}
vector operator +(vector t); vector operator =(vector t); int & operator[](int i); void show(void);};
vector vector::operator+(vector t) {vector tmp;
for (int i=0; i<3; i++) tmp.v[i]=t.v[i]+v[i] return tmp;}
vector vector::operator=(vector t) {vector tmp;
for (int i=0;i<3;i++) v[i]=t.v[i];
return *this;}
int &vector::operator[](int i) {return v[i];}
void vector::show(void)
{for (int i=0;i<3;i++) cout<<v[i];}
main(void)
{vector v1(1,2,3), v2(10,11,12),v3; v3=v1+v2;
for (int i=0;i<3;i++) cout<<v3[i]; v3.show(); v1[0]=100; v1[1]=201; v2[2]=302; v1.show();}
9. АРГУМЕНТЫ ПО УМОЛЧАНИЮ
Аргументы по умолчанию являются вспомогательным средством, как и перегрузка функций. Обе возможности позволяют использовать одно имя функции в разных ситуациях. Различие состоит в том, что при определении аргументов по умолчанию компилятор сам подставляет аргументы.
Вспомним перегруженные конструкторы в классе data: date (int day, int month, int year);
date (int); date (void);
Все три функции можно заменить одной, если считать, что по умолчанию дата устанавливается 01 января 2000 г.
date (int day=1, int month=12, int year=2000);
Вновой версии определения объектов дают одинаковые результаты. date A(1,12,200); date B(1); date C();
Вобоих случаях вызывается один и тот же конструктор, но для В компилятор автоматически подставляет второй и третий аргумент, для С – все три аргумента. Аргументы по умолчанию и перегруженные функции позволяют использовать одно имя в разных ситуациях. Различие состоит в том, что при определении аргументов по умолчанию компилятор сам подставляет аргументы. Как правило, если поведение функций не сильно отличается, следует использовать значения аргументов по умолчанию.
Используя аргументы по умолчанию, необходимо помнить о двух правилах. Во-первых, значения по умолчанию могут назначаться только для аргументов, завершающих список. Нельзя объявить аргумент по умолчанию,
за которым будет следовать аргумент с явно задаваемым значением. Вовторых, после первого аргумента по умолчанию все последующие аргументы в списке также должны быть аргументами по умолчанию.
Пример. |
|
date D( , ,200); date E(8, , 2018); |
/ выдаёт сообщение об ошибке |
