- •Преобразование типов указателей
- •Операторы определения адреса и обращения по адресу
- •Указатели на константы и константные указатели
- •Арифметические действия с указателями
- •Одномерные и многомерные массивы.
- •Строки символов. Основные функции для работы со строками.
- •Перечисление.
- •Структура.
- •Объединения.
- •Битовые поля.
- •Тип данных bool. Тип данных wchar_t.
- •Способы передачи параметров в подпрограммы.
- •Операторы распределения памяти.
- •Объявление typedef.
- •Оператор sizeof.
- •Передача аргументов по умолчанию.
- •Встроенные функции.
- •Определение пространства имён.
- •Оператор разрешения области видимости.
- •Объявление «using». Директива «using». Псевдонимы.
- •Механизм обработки исключений.
- •Вложенные исключения.
- •Определение класса.
- •Указатель this. Спецификаторы доступа к членам класса.
- •«Друзья» класса.
- •Конструктор класса. Список инициализации.
- •Конструктор по умолчанию.
- •Конструктор копирования.
- •Явные конструкторы.
- •Деструкторы.
- •Встроенные функции–члены класса. Статические члены класса.
- •Функции-члены класса с квалификаторами const и volatile.
- •Вложенные классы. Локальные классы.
- •Общие правила перегрузки операторов.
- •Перегрузка оператора присваивания.
- •Оператор индексирования [].
- •Перегрузка бинарных операторов.
- •Составные операторы присваивания.
- •Оператор вызова функции.
- •Операторы преобразования типов (конверторы).
- •Структура данных – стек.
- •Структура данных – очередь.
- •Деревья.
- •Наследование
- •Доступ к членам наследуемого класса
- •Конструкторы, деструкторы и наследование
- •Наследование и присваивание.
- •Виртуальные функции.
- •Полиморфизм и позднее связывание.
- •Передача аргументов по умолчанию в виртуальные функции.
- •Виртуальные деструкторы.
- •Абстрактные классы.
- •Множественное наследование.
- •Виртуальное наследование.
Перегрузка бинарных операторов.
Бинарные операторы могут быть перегружены как нестатические члены класса с одним параметром:
Возращаемый_тип operator @ (параметр);
Или как операторы, не являющиеся членами класса, с двумя параметрами:
Возвращаемый_тип operator @ (параметр1, параметр2);
@ - один из следующих операторов: + - * / % == <= >= != && || << >>.
Если аргументами (параметрами) бинарного оператора являются объекты одного класса, то этот оператор лучше перегружать как friend-функцию с двумя параметрами. Если же объекты относятся к разному типу, то лучше перегружать как член класса. Например, если операция выполняется над двумя дробями, то лучше использовать friend-функцию, а если операция выполняется над дробью и целым числом, то лучше перегружать как функцию класса.
Пример: перегрузим логический оператор < для дробей:
rational.h:
friend bool operator < (const &r1, const &r2);
rlib.cpp:
bool operator < (const &r1, const &r2)
{
return (r1.n*r2.d<r1.d*r2.n)
}
Составные операторы присваивания.
К составным операторам присваивания относятся +=, -=, *=, /=, %=, <<=, >>=. составные операторы присваивания могут быть перегружены только как нестатические члены класса. Перегруженные составные операторы присваивания имеют следующий прототип:
Имя_класса & operator @ (const имя_класса&);
Где @ - один из вышеперечисленных операторов. Как видно, этот прототип аналогичен прототипу простого оператора присваивания. Учитывая этот факт, можно отметить, что в реализации составных операторов присваивания не нужно выполнять проверку на присваивание объекта самому себе.
Перегрузим +=:
Пишем в rational.h:
ratio & operator *= (const ratio &r);
В lib:
ratio & ratio::operator *= (const ratio &r)
{
n*= r.n;
d* = r.d;
reduce ()
return *this;
}
Замечание: при вызове этого оператора через this передаётся ссылка на объект, который стоит слева в составном операторе присваивания.
Оператор вызова функции.
Оператор вызова функции может быть перегружен также как нестатический член класса. Перегруженный оператор функции () должен иметь следующий прототип:
Тип operator () (список параметров)
Количество параметров может быть неопределённым. Допускается также определение значения параметров по умолчанию. Вызывается оператор вызова функции путём применения списка аргументов к объекту класса, в котором он определён. Так как в этом случае объект может использоваться как функция, то он называется объектом-функцией или функциональным объектом.
# include <iostream>
using namespace std;
struct Inc
{
int & operator () (int & n) {return ++n;}
};
int main ()
{Inc inc;
int n = 1;
inc (n);
cout<<inc(n)<<endl;
}
Перегрузка операторов для ввода/вывода (<<, >>).
Перегруженные операторы ввода/вывода << и >> должны всегда определяться как друзья класса и иметь следующий прототип:
friend istream & operator >> (istream & имя, имя_класса &);
friend ostream & operator << (ostream & имя, имя_класса &);
Перегрузим эти функции для дробей, имена в 1-м и во 2-м случае должны быть разные, поскольку разные параметры вносятся и выводятся: