Программирование >>  Дополнительные возможности наследования 

1 ... 83 84 85 [ 86 ] 87 88 89 ... 265


Область динамического обмена

старый класс cat

itsAge


Рис. 10.3. Пример глубинного копирования

Когда выполнение профаммы выходит за область видимости класса CAT, автоматически запускается деструктор. Выполнение десфуктора класса CAT показано в строках с 37 по 43. Оператор delete применяется к обоим указателям - itsAge и itsWeigth, после чего оба указателя для надежности обнуляются.

Перегрузка операторов

Язык С++ располагает рядом всфоенных типов данных, включая int, real, char и т.д. Для работы с данными этих типов используются встроенные операторы - суммирования (+) и умножения ( ). Кроме того, в С++ сушествует возможность добавлять и перефужать эти операторы для собственных классов.

Чтобы в деталях рассмотреть процедуру перефузки операторов, в листинге 10.6 создается новый класс Counter. Объект класса Counter будет использоваться в других приложениях для подсчета циклов инкрементации, декрементации и других повторяющихся процессов.

Аостннг 10.В. КаЗСС Counter

1 2 3 4 5 6 7 8 9

10 11 12 13 14 15 16

Листинг 10.6. Класс Counter

ffinclude <iostream.h>

class Counter {

public:

CounterO; Counter()< }

int GetItsVal()const < return itsVal; } void SetItsVal(int x) < itsVal = x; }

private: int itsVal;



17 18 19 20 21 22 23 24 25 26 27 28 29

Counter::Counter():

itsVal(O)

int mainO {

Counter i;

cout The value of i is i.GetItsVal() endl; return 0; }

The value of i is 0

I - Судя no определению в строках профаммы с 7 no 18, это совершенно

бесполезный класс. В нем объявлена единственная переменная-член типа

int. Конструктор по умолчанию, который объявляется в строке 10 и выполняется в строке 20, инициализирует переменную-член нулевым значением.

В отличие от обычной переменной типа int, объект класса Counter не может использоваться в операциях прирашения, прибавляться, присваиваться или подвергаться другим манипуляциям. В связи с этим выведение значения данного объекта на печать также сопряжено с рядом трудностей.

Запись функции ннкрвмвнта

Офаничения использования объекта нового класса, которые упоминались выше, можно преодолеть путем перефузки операторов. Например, сушествует несколько способов восстановления возможности прирашения объекта класса Counter. Один из них состоит в том, чтобы перефузить функцию инкрементации, как показано в листинге 10.7.

Апстинг 10.7. Добавясние в кявсс ouepamopa инкремента

10 11 12 13 14

Листинг 10.7.

Добавление в класс Counter оператора инкремена int

flinclude <iostream.h>

class Counter {

public:

CounterO; Counter(){ }

int GetltsValOconst { return itsVal; } void SetltsVaKint x) { itsVal = x; } void IncrementO { ++itsVal; }



15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32

private; int itsVal;

Counter::Counter():

itsVal(O)

int main() {

Counter 1;

cout The value of i is i.GetltsValO endl; i.Increment();

cout The value of i is i.GetItsVal() endl; return 0; }

The value of i is 0 The value of i is 1

В листинге 10.7 добавляется функция оператора инкремента, определенная в строке 14. Хотя профамма работает, выглядит она довольно неуклюже. Профамма из последних сил старается перефузить ++operator, но это можно реализовать другим способом.

Нврвгрузка префиксных операторов

Чтобы перефузить префиксный оператор, можно использовать функцию следующего типа:

returnType Operator op (параметры)

В данном случае ор - это перефужаемый оператор. Тогда для перефузки оператора преинкремента используем функцию

void operator++ ()

Этот способ показан в листинге 10.8.

Аисшииг 10.8. Перегрузка ouepaniopa преппкременша

Листинг 10.8.

Перегрузка оператора преинкремента в классе Counter int

#include <iostream.h>

class Counter {



1 ... 83 84 85 [ 86 ] 87 88 89 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика