
- •Класс и атд
- •Классификация методов
- •Действия над объектами
- •Способы задания доступа
- •Область видимости класса
- •Указатель this
- •Функции-члены типа static и const
- •Перегрузка операторов
- •Доступные и недоступные для перегрузки операторы:
- •Перегрузка обычными функция, как компонентными
- •Примеры перегрузки операторов:
- •56. Параметрический полиморфизм: шаблонные классы и шаблонные функции - назначение, параметризованные типы данных, синтаксис и семантика.
Перегрузка операторов
Ключевое слово operator используется для того, чтобы определить функцию-член, осуществляющую преобразование типа. Оно также используется для перегрузки встроенных операторов C++. Также как имени функции, такому как print, можно придать множество различных смыслов, зависящих от аргументов, так и оператору, например, +, можно приписать доп значения. Перегруженные операторы можно исп-ть для привычной записи выр-ий как для встроенных типов, так и для АТД.
Унарные и бинарные операторы могут быть перегружены как нестатические функции-члены. Они неявно действуют на объект класса. Большинство унарных операторов можно перегружать как обычные функции, принимающие единственный аргумент класса или ссылку на тип класса. Большинство бинарных операторов можно перегружать как обычные функции, принимающие один или оба аргумента класса или ссылку на тип класса. Операторы =, (), [ ] и -> должны быть перегружены нестатическими функциями-членами.
class foo {
public:
foo operator- ();//унарный минус: - foo
foo operator- (int) ; //бинарный минус: foo - int
foo operator-(foo); };//бинарный минус: foo - foo
foo operator-(int, foo); //бинарный минус: int - foo
Доступные и недоступные для перегрузки операторы:
Нельзя: составляют операторы выбора члена,условный оператор ?, оператор sizeof и оператор разрешения области видимости ::
Можно: арифметические и логические операторы, операторы сравнения, равенства, присваивания и битовые операторы, операторы автоинкремента и автодекремента ( + + и —), опер-ры индексации массива [] и вызова функции (), опер-ры доступа к члену через указатель на объект - >, и обращения к члену через указатель на член ->*, new и delete.
Перегрузка обычными функция, как компонентными
Выбор между представлением в виде функции-члена или обычной функции /функции-не-члена) обычно зависит от того, допустимо и желательно ли неявное преобразование. Явная передача аргумента допускает его автоматическое приведение, если это необходимо и возможно. Если перегрузка осуществлена функцией-членом, то + + с равнозначно с . operator++ () Если перегрузка выполнена функцией-не-членом, то + + с равнозначно operator++ (с)
Примеры перегрузки операторов:
class clock {
public:
clock(unsigned long i); void print() const;
void tickO; //добавляет одну секунду
clock operator++(){ tick(); return *this; } // обновляет неявную переменную типа clock и возвращает обновленное значение
void reset (const clocks c);
friend clock operator +(clock cl, clock c2) ;
clock operator - (clock c);
friend clock operator *(unsigned long m, clock c);
friend clock operator *(clock c, unsigned long m);
private:
unsigned long tot_secs, sees, mins, hours, days;}
Можно перегрузить префиксный оператор ++, используя и обычную функцию:
clock operator++(clocks cl)
{cl.tick{); return cl;}
Перегрузка оператора индексирования:
имя_класса&. operator [] (целочисленный тип) ;