ПРЕДЕФИНИРАНЕ НА ОПЕРАТОРИ
| Информационни технологии | 2009-12-04 | 127 сваляния |
8. ПРЕДЕФИНИРАНЕ НА ОПЕРАТОРИ
Въведение
Преобладаващата част от операторите (+, -, *, /, ++ и др.) могат да се предефинират така, че те да реализират специфични действия в зависимост от типовете на операндите. Предефинирането на оператори позволява операциите с конструирани от потребителя типове (класове и структури) да се записват по същия начин, както се записват операциите с основните типове. Например, операторът + може да бъде предефиниран така, че операцията събиране на два вектора р и q да може да запише като р + q, т.е. сумата на векторите се записва по същия начин както се записва и сума на обикновени числа, което прави програмите по-разбираеми.
Предифинирането на оператори се подчинява на определени правила например:
1. Множеството на операторите, които могат да бъдат предефинирани, е следното:
[] () -> ++ -- & * + - ~ ! sizeof / % << >> < > <= >= == != ^ /=
&& || = *= &= ^= |= += -= <<= >>=
Операторите :: . ?: . * , както и символът #, който се използува в директивите на препроцесора, не могат да бъдат предефинирани.
2. Не е възможно да се променят основните характеристики на операторите. Такива характеристики са техният приоритет, броят операндите и правилата за асоциативност. Следователно операторите -- и ++ са винаги унарни, докато операторите + - & * могат да бъдат предефинирани като унарни и като бинарни.
3. Някои от свойствата на оригиналните оператори могат да се загубят след тяхното предефиниране. Например оригиналните оператори ++ и -- имат префиксна и инфиксна форма, което не е валидно за предефинираните оператори ++ и --.
4. Първоначалната семантика на операторите не може да се променя. Например, операторът ++, приложен върху променлива от тип int винаги означава инкремснтиране и не може да се предефинира така, че да реализира друго действие върху променливи от този тип.
5. Предефинирането става чрез специален вид функции, наречени операторни функции. Името на операторна функция се състои от ключовата дума operator и мнемоничното означение на оператора, който се предефинира чрез нея. Операторната функция може да бъде нестатичен метод на клас или външна за класа функция, която има поне един параметър от тип class. Изключение от това правило правят операторите new и delete.
7. Един и същ оператор може да бъде предефиниран многократно чрез множество операторни функции, които трябва да се различават по типа и/или броя на параметрите си.
8. Операторната функция има достъп до компонентите на класа, обявени като private или protected, когато е метод или функция-приятел на този клас.
9. Предефинираните оператори, с изключение на оператора за присвояване =, се наследяват в съответствие с правилата за наследяване, валидни за останалите компоненти на класовете.
Когато операторната функция е нестатичен метод на класа, тя е с един параметър и той трябва да съответства на втория операнд на предефинирания оператор. Първият операнд се предава неявно чрез указателя this.
Програма 8.1. Програма за намиране сума и разлика на вектори, реализирана чрез предефини-ране на операторите + и - за класа vector.
#include
#include
//Декларация ма класа vector
margin-bottom: 0in; orphans: 2; text-align: left; text-indent: 0in; widows: 2"> float x, y;
public:
void getData();
void display();
vector operator+(vector); //Операторната функция е метод на класа
friend vector operator-(vector&,vector);//Опер. ф-я е приятел нa класа
};
//Дефиниция на метода getData
Тагове от реферата: предефинира, опеатор, операорит, реаира, преоб, ъведение











