Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа 17.doc
Скачиваний:
32
Добавлен:
11.04.2015
Размер:
142.34 Кб
Скачать

Перегружаемые операции

Для перегрузки встроенных операторов С++ можно использовать ключевое слово operator. Ему может быть присвоен ряд значений, зависящих от параметров. Таким образом оператору типа + можно присвоить дополнительные значения. Это облегчает написание программ и делает их более читабельными.

vect oprator *(const vect &,const matix &)

где * является двухместным оператором умножения.

matix t; vect s,r; s=t*r; // s=mpy(r,t); Перегруженный оператор можно вызвать и использованием функциональной формы записи: s=operator*(t,r); Хотя операторам и могут добавляться новые значения, но их приоритет остается прежним. Например, операция умножения имеет более высокий приоритет, чем сложение. Перегружены могут все операторы. Нельзя использовать аргументы по умолчанию.

Доступны все арифметические, логические операторы, операторы сравнения, равенство, присвоение, операторы поразрядных операций, префиксные и постфиксные формы операторов приращения и декремента. могут быть перегружены операторы индексации “[]” и обращения к функции “()”. Также могут быть перегружены оператор указателя класса “->“ и оператор указателя на член “->*”. Возможна перегрузка new, delete.

Перегрузка унарного оператора

Одноместные операторы типа “!”, “++”, “~” “[]”.

class clock

{

unsigned long sec;

public:

clock(unsigned long s):sec(s) { }

void tick() { sec++; }

clock operator++() { tick(); return *this; }

};

void main() { clock t(100); ++t; }

Этот класс перегружает префиксный оператор приращения ++. Перегруженный оператор представляет собой функцию-член. Перегруженный operator++() также обновляет неявную переменную clock и возвращает обновленное значение.

Префиксную операцию ++ можно перегрузить, используя friend-функцию.

frien clock operator++(clock &s1) { s1.tick(); return s1; }

Так как переменная clock должна увеличиваться мы передаем ее по ссылке. Решение о выборе между представлением friend и функцией-членом обычно зависит от того, насколько необходимы и доступны операторы неявного преобразования. Явная передача аргумента, как в friend-функции, позволяет автоматическое его приведение.

Операции инкремента и декримента могут быть перегружены как для префиксной, так и для постфиксной формы записи. Префиксная форма объявляется как операция-член класса, которая не имеет аргументов, либо как дружественная операция, которая имеет один аргумент, представляющий собой ссылку на объект данного класса. Постфиксная форма объявляется как операция-член класса, которая имеет один аргумент типа int, либо как дружественная операция, которая имеет два аргумента: ссылку на объект данного класса и аргумент типа int. Аргумент типа int на самом деле не используется. Фактически он имеет нулевое значение.

class X {

public:

X & operator ++(); //Префиксная форма

X & operator ++(int); // Постфиксная форма

};

class Y {

public:

friend Y & operator ++(Y &); //Префиксная форма

friend Y & operator ++(Y &,int); // Постфиксная форма

};

@x интерпретируется как x.opertor@(), если operator @ - функция-член и operator@(x), если operator @ - дружественная функция.