Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование_на_С++_Ч2_ООП.doc
Скачиваний:
54
Добавлен:
22.02.2015
Размер:
633.34 Кб
Скачать

Перегрузка бинарных операций

Бинарная функция-операция, определяемая внутри класса, должна быть представлена с помощью нестатического метода с параметрами, при этом вызвавший ее объект считается первым операндом:

class monstr {

bool operator > (const monstr &M) {

if (health >M.get_health ( ) ) return true;

return false;

}

};

Если функция определяется вне класса, она должна иметь два параметра типа класса:

bool operator > (const monstr &M1, const monstr &M2) {

if (M1.get_health ( ) > M2.get_health ( )) return true;

return false;

}

Перегрузка операции присваивания

Операция присваивания определена в любом классе по умолчанию как поэлементное копирование. Эта операция вызывается каждый раз, когда одному существующему объекту присваивается значение другого. Если класс содержит поля, память под которые выделяется динамически, необходимо определить собственную операцию присваивания. Для того чтобы сохранить смысл присваивания, функция-операция должна возвращать ссылку на объект, для которого она вызвана, и принимать в качестве параметра единственный аргумент – ссылку на присваиваемый объект.

class monstr &operator = (const monstr &M) {

//

if (&M= =this) return *this;

if (name) delete [ ] name; //

if (M.name) {

name = new char [strlen(M.name) c+1];

strcpy (name, M.name;}

else name =0;

health = M.health; ammo = M.ammo;

skin = M.skin;

return *this;

}

Возврат из функции указателя на объект делает возможной цепочку операций присваивания:

monstr A(10), B, C;

C = B = A;

Операцию присваивания можно определять только как метод класса. Она не наследуется.

Перегрузка операции приведения типа

Можно определить функции-операции, которые будут осуществлять преобразование объекта класса к другому типу. Формат:

оperator имя_нового_типа ( );

Пример

monstr :: operator int ( ) {return health;}

Наследование Ключи доступа

При описании класса в его заголовке перечисляются все классы, являющиеся для него базовыми. Возможность обращения к элементам этих классов регулируется с помощью ключей доступа private, protected и public:

class имя : [private | protected | public] базовый класс

{тело класса};

Если базовых классов несколько, они перечисляются через запятую. Ключ доступа может стоять перед каждым классом, например:

class A {…};

class B {…};

class C {…};

class D: A, protected B, public C {…};

По умолчанию для классов используется ключ доступа private, а для структуры – public (см. табл. 1).

Таблица 1

Связь ключей доступа и спецификаторов доступа

Ключ доступа

Спецификатор в производном классе

Доступ в производном классе

Комментарий

private

private

protected

public

private

private

private

Все элементы private

protected

private

protected

public

private

protected

protected

Все элементы protected, кроме private

public

private

protected

public

private

protected

public

Не изменяется

Из таблицы видно, что private элементы базового класса недоступны вне зависимости от ключа. Обращение к ним может осуществляться только через методы базового класса.