Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
Реализация принципа наименьших привилегий в классах
● Константные объекты ● Константные элементы
Const time (имя класса) noon (12, 0, 0); // объявили объект, объект создан Для константного объекта компилятор не допускает никаких вызовов функций элементов, т.е. нельзя получить информацию даже о параметрах объекта. Чтобы преодолеть этот недостаток в класс вводят специальные константные функции. Перегрузка операций Чтобы известными операциями пользоваться для любых типов данных, также как для стандартным, эти операции надо перепрограммировать, т.е. перегрузить ( чтобы использовать пользовательский тип). Перегружать можно любые операции, кроме: 1. Операция точка . 2. Операция стрелка точка →. 3. Операция точка звездочка .* 4. ?: 5. :: 6. # 7. ## 8. Sizeof
● Правила перегрузки операций: 1. Сохраняется количество аргументов, приоритеты и правила ассоциации, принятые для стандартных типов данных 2. Перегружать операции для стандартных типов данных нельзя 3. Функции операций, которые используются для перегрузки операций, не могут иметь аргументов по умолчанию 4. Функции операций наследуются, за исключением операции присваивания = 5. Функции операции не могут быть статическими (static – не могут использоваться)
Перегрузка операций осуществляется с помощью специальных функций – функций операции: Тип operator <символ операции> (список параметров) Operator <символ> - имя функции Можно использовать функции как: 1. Функция - элемент класса 2. Дружественная функция или друг 3. Просто функция Примечание: операцию нельзя перегрузить с помощью функции элемента, первый параметр которой не имеет тип class.
● Перегрузка унарных операций ++ -- 1. префиксный инкремент 1. Как функция элемента класса class time { ----------- Time&operator ++ () {++h; return *this;} 2. Как дружественная функция class time { ----------- Friend time&operator ++ (time & t); ----------- Time & operator ++ (time &t) {++t.h; return t;} Дружественная функция не является функцией элемента класса, но она имеет доступ к закрытой части класса через имя объекта, через указатель, через ссылку на объект, она нарушает закрытость класса, но на практике бывает необходимо ее использовать. 3. Как просто функция - функция определена вне класса Time & operator ++ (time&t) { int k=t.geth (); K++; t.seth(k); return t; }
2. Операция постфиксного инкремента Class time { ------------- Time operator ++ (int – формально, для отличия) {h++; time t(*this); return t; } Void main () {time t; Cout << (t++).geth(); }
● Перегрузка бинарных операций Имеет 2 операнда, первым операндом является тот объект класса, для которого вызывается данная функция, а вторым – объект, переданный в функцию. Class time { ------------- Bool operator > (const time & t) {if (h>t.geth()) return true; Return false; ------------ } };
Void main () {time t1, t2; -------------- If (t1>t2) ---- -------------- }
Перегрузка просто функцией: Bool operator > (const time&t1, const time&t2) {if (t1.geth()>t2.geth()) return true; Return false; }
● Перегрузка операции приведения типа Operator имя_нового_типа ();
Time :: operator int () {return h;} ------------- Time t; Cout<< int(t);
● Перегрузка операции индексирования Язык Си и Си++ не позволяет контролировать выход за пределы массива, использование классов и перегрузки индексирования преодолевает этот недостаток.
Int &vector :: operator[] (int i); {if(i<0 || i>=size) {cout<< “Неверный индекс” i=” << I << “ Завершение программы” <<endl; Exit (0); } Return p[i]; Композиция классов Состоит в том, что объекты одних классов являются элементами других классов. Class date {public: Date (int=1, int=1, int=1980); Void print() const; Private: Int m, d, y; };
Class employee {public: Employee (char*, char*, int, int, int, int, int, int); Void print () const; Private: Date bdat; // дата рождения Date hdat; // дата приема на работу };
Employee::employee (char*f, char*l, int bm, int bd, int by, int hm, int hd, int hy) : bdat (bm, bd, by), hdat (hm, hd, hy) // инициализаторы элементов, служат для вызова конструктора класса date, если инициализаторов нет – вызывается конструктор с умолчанием, если и его нет, то – ошибка. { -----};
Void main(); {employee e {”Петров”, “Иван”, 7, 24,1979, 6, 11, 2000}; ----------- }
● Дружественные функции класса, дружественные классы #include <iostream.h> Class count {friend void setx (count&, int); Public: Count() {x=0;} Void print () const {cout << x << endl;} Private: Int x; };
Void setx (count &c, int v) {c.x = v;} // дружественная функция имеет доступ к закрытой части класса через ссылку
● Дружественный класс Если нужно чтобы функции элементов одного класса имели доступ к данным элементам и функциям другого класса, то первый класс объявляется дружественным ко второму. Class BinSTree; Class TreeNode {friend class BinSTree; // функции элемента класса BinSTree получают доступ к элементам класса TreeNode ----- } ● Использование указателя this В функциях - элементах класса: Функции-элементы имеют прямой доступ к указателю на объект, для которого эта функция вызывается, обычно указатель используется неявно, но можно и явно.
|
Последнее изменение этой страницы: 2019-05-08; Просмотров: 251; Нарушение авторского права страницы