Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Лафоре Р. -> "Объектно-ориентированное программирование в С++" -> 119

Объектно-ориентированное программирование в С++ - Лафоре Р.

Лафоре Р. Объектно-ориентированное программирование в С++ — М.: Питер, 2004. — 992 c.
Скачать (прямая ссылка): obektnoorentprogramm2004.djvu
Предыдущая << 1 .. 113 114 115 116 117 118 < 119 > 120 121 122 123 124 125 .. 341 >> Следующая


Counter cl. c2:

// определяем переменные

cout « "\ncl = " « cl.get_count ( ): // выводим на экран cout « "\nc2 = " « c2.get_count ( ):

++cl ++c2 ++c2

// увеличиваем cl // увеличиваем c2 // увеличиваем c2

cout « "\ncl = " « cl.get_count ( ): // снова показываем значения cout « "\nc2 = " « c2.get_count ( ) « endl:

return 0:

В этой программе мы создали два объекта класса Counter: cl и с2. Значения счетчиков выведены на дисплей, сначала они равны 0. Затем, используя перегрузку операции ++, мы увеличиваем Cl на единицу, а с2 на два и выводим полученные значения. Результат работы программы:

Выражения, соответствующие этим действиям:

++Cl:

++с2; ++с2:

Операция ++ применена к Cl и дважды применена к с2. В этом примере мы использовали префиксную версию операции ++, постфиксную мы объясним позднее.

Как использовать обычные операции с определенными пользователями типами? В этом объявлении использовано ключевое слово operator для перегрузки операции ++:

void operator++ ( )

Сначала пишут возвращаемый тип (в нашем случае void), затем ключевое слово operator, затем саму операцию (++) и наконец список аргументов, заключенный в скобки (здесь он пуст). Такой синтаксис говорит компилятору о том, что если операнд принадлежит классу Counter, то нужно вызывать функцию с таким именем, встретив в тексте программы операцию ++.

Мы видели в главе 5 «Функции», что только компилятор может различать перегружаемые функции по типу данных и количеству их аргументов. Перегру-

Cl = О

с2 = О

Cl = 1

с2 = 2

- изначально обе переменные равны нулю

- после однократного увеличения

- после двукратного увеличения

Ключевое слово operator Перегрузка бинарных операций 315

жаемые операции компилятор отличает по типу данных их операндов. Если

операнд имеет базовый тип, такой, как int в

++intvar:

то компилятор будет использовать свою встроенную процедуру для увеличения переменной типа int. Но если операнд является объектом класса Counter, то компилятор будет использовать написанную программистом функцию operator++().

Аргументы операции

В функции main() операция ++ применена к объекту, как в выражении ++Cl. До сих пор функция operator++() не имела аргументов. Что же увеличивает эта операция? Она увеличивает переменную count объекта, к которому применяется. Так как методы класса всегда имеют доступ к объектам класса, для которых они были вызваны, то для этой операции не требуются аргументы. Это показано на рис. 8.1.

Благодаря ++с1; -4- этому оператору

Рис. 8.1. Перегрузка унарной операции без аргументов

Значения, возвращаемые операцией

Функция operator++() программы C0UNTPP1 имеет небольшой дефект. Вы можете его выявить, если используете в функции main() строку, похожую на эту:

Cl = ++с2;

Компилятор будет протестовать. Почему? Просто потому, что мы определили тип void для возвращаемого значения функции operator++(). А в нашем выражении присваивания будет запрошена переменная типа Counter. То-есть компилятор запросит значение переменной с2, после того как она будет обработана операцией ++, и присвоит ее значение переменной Cl. Но, при данном нами определении в C0UNTPP1, мы не можем использовать ++ для увеличения объекта Counter в выражении присваивания: с таким операндом может быть использована только операция ++. Конечно, обыкновенная операция ++, примененная к данным таких типов, как int, не столкнется с этими проблемами. 316

Глава 8. Перегрузка операций

Для того чтобы иметь возможность использовать написанный нами operator++() в выражениях присваивания, нам необходимо правильно определить тип его возвращаемого значения. Это сделано в следующей нашей программе C0UNTPP2.

// countpp2.cpp

// операция ++. возвращающий значение !include <iostream> using namespace std: ///////////////////////////////////////////////////////////

class Counter {

private:

unsigned int count: public:

Counter ( ) : count ( 0 ) { }

unsigned int get_count ( )

{ return count: } Counter operator++ ( )

I

++count: Counter temp: temp.count = count: return temp;

}

}:

///////////////////////////////////////////////////////////

int main ( ) {

Counter cl. c2: // определяем переменные

cout « "\ncl = " « cl.get_count ( ); // выводим на экран cout « "\nc2 = " « c2.get_count ( ):

++cl: // увеличиваем cl

c2 = ++cl: // cl=2, с2=2

cout « "\ncl = " « cl.get_count C ): // снова показываем значения cout « "\nc2 = " « c2.get_count ( ) « endl:

return 0:

}

Здесь функция operator++() создает новый объект класса Counter, названный temp, для использования его в качестве возвращаемого значения. Она сначала увеличивает переменную count в своем объекте, а затем создает объект temp и присваивает ему значение count, то же значение, что и в собственном объекте. В конце функция возвращает объект temp. Получаем ожидаемый эффект. Выражение типа

++Cl

теперь возвращает значение, которое можно использовать в других выражениях, таких, как:

Предыдущая << 1 .. 113 114 115 116 117 118 < 119 > 120 121 122 123 124 125 .. 341 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100