- •Преобразование типов указателей
- •Операторы определения адреса и обращения по адресу
- •Указатели на константы и константные указатели
- •Арифметические действия с указателями
- •Одномерные и многомерные массивы.
- •Строки символов. Основные функции для работы со строками.
- •Перечисление.
- •Структура.
- •Объединения.
- •Битовые поля.
- •Тип данных bool. Тип данных wchar_t.
- •Способы передачи параметров в подпрограммы.
- •Операторы распределения памяти.
- •Объявление typedef.
- •Оператор sizeof.
- •Передача аргументов по умолчанию.
- •Встроенные функции.
- •Определение пространства имён.
- •Оператор разрешения области видимости.
- •Объявление «using». Директива «using». Псевдонимы.
- •Механизм обработки исключений.
- •Вложенные исключения.
- •Определение класса.
- •Указатель this. Спецификаторы доступа к членам класса.
- •«Друзья» класса.
- •Конструктор класса. Список инициализации.
- •Конструктор по умолчанию.
- •Конструктор копирования.
- •Явные конструкторы.
- •Деструкторы.
- •Встроенные функции–члены класса. Статические члены класса.
- •Функции-члены класса с квалификаторами const и volatile.
- •Вложенные классы. Локальные классы.
- •Общие правила перегрузки операторов.
- •Перегрузка оператора присваивания.
- •Оператор индексирования [].
- •Перегрузка бинарных операторов.
- •Составные операторы присваивания.
- •Оператор вызова функции.
- •Операторы преобразования типов (конверторы).
- •Структура данных – стек.
- •Структура данных – очередь.
- •Деревья.
- •Наследование
- •Доступ к членам наследуемого класса
- •Конструкторы, деструкторы и наследование
- •Наследование и присваивание.
- •Виртуальные функции.
- •Полиморфизм и позднее связывание.
- •Передача аргументов по умолчанию в виртуальные функции.
- •Виртуальные деструкторы.
- •Абстрактные классы.
- •Множественное наследование.
- •Виртуальное наследование.
Перегрузка оператора присваивания.
Оператор присваивания может быть перегружен только как нестатический член класса. Перегруженный оператор присваивания должен иметь следующий прототип:
Имя_класса & operator = (const имя_класса&);
При реализации оператора присваивания должна проверяться возможность неосторожного присваивания объекта самому себе. Перегрузим оператор для нашей дроби:
Пишем в rational.h:
ratio & operator = (const ratio &r);
В lib:
ratio & ratio::operator = (const ratio &r)
{if (&r == this) //&r – адрес r, this – указатель на адрес этого объекта-члена класса
return *this;
n = r.n;
d = r.d;
return *this;
}
Объект, который вызывает оператор this находится слева от «=», a = b;
a – this (n, d); b - (const ratio &r): r.n, r.d.
Если оператор присваивания не определён в классе, то компилятор генерирует его по умолчанию. В этом случае осуществляется просто почленное присваивание атрибутов класса. Для дробей можно не осуществлять перегрузку оператора присваивания.
Оператор присваивания нужно обязательно перегрузить, если присваивание осуществляется нетривиальным образом. Например, при присваивании объектов динамический массив необходимо осуществить перегрузку, поскольку перед выполнением операции присваивания необходимо выделить память под новый массив.
Если через оператор присваивания инициализируется новый объект, то вместо вызова конструктора по умолчанию и оператора присваивания можно сразу же вызвать конструктор копирования. Как правило, оператор присваивания и конструктор копирования содержат много общего программного кода. Поэтому в этом случае пишут отдельную закрытую функцию, содержащую этот код, и вызывают её как в операторе присваивания, так и в конструкторе копирования.
Оператор индексирования [].
Оператор индексирования [] перегружается только как нестатический член класса с одним параметром. Перегрузка этого оператора обеспечивает доступ к отдельным элементам класса по их индексу. Очень часто этот оператор используется для контейнерных классов.
Контейнерными классами называются классы, которые состоят из набора одинаковых элементов. Например, класс студенты можно организовать как контейнерный класс, содержащий набор однотипных записей, где каждая запись содержит сведения об одном студенте.
Оператор индексирования может использоваться как для константного, так и для неконстантного объекта. Оператор индексирования может появиться как слева, так и справа от оператора присваивания.
Операторы инкремента и декремента (++, --).
Операторы инкремента и декремента могут быть перегружены как члены класса без аргументов или как друзья класса с одним аргументом. Операторы инкремента и декремента делятся на префиксные и постфиксные.
void main ()
{int n=1;
int k;
k = ++n;
cout<<k<<endl; //префиксный
k = n++;
cout<<k<<n<<endl; //постфиксный
}
Для того, чтобы префиксные операторы инкремента и декремента отличать от соответствующих постфиксных в объявление постфиксных операторов вводят дополнительный фиктивный параметр типа int.
Пример префиксной перегрузки:
ratio & operator ++ ()
{n = n+d;
Reduce ();
return *this;
}
Пример постфиксной перегрузки:
ratio & operator ++ (int)
{n = n+d;
Reduce ();
return ratio (n-d, d);
}