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

 

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

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

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

с2 = ++Cl: Перегрузка бинарных операций 317

как показано в функции main(), где значение, возвращаемое cl++, присваивается с2. Результат работы этой программы будет следующим:

Cl = О

с2 - О Cl - 2

с2 = 2

Временные безымянные объекты

В примере C0UNTPP2 мы создали временный объект temp типа Counter, чьей единственной целью было хранение возвращаемого значения для операции ++. Реализация этого объекта потребовала трех строк программы:

Counter temp; // временный обьект Counter

temp.count = count: // присваиваем ему значение count return temp: // возвращаем обьект

Существует много путей возвращения временного объекта из функции или перегруженной операции. Давайте рассмотрим еще один из способов в программе C0UNTPP3:

// countpp3.cpp

// операция ++ с использованием недекларированной переменной #iпсіude <iostream> using namespace std: ///////////////////////////////////////////////////////////

class Counter {

private:

unsigned int count: public:

Counter ( ) : count ( 0 ) {}

Counter ( int с ) : count ( с ) { }

unsigned int get_count ( ) { return count: }

Counter operator++ ( ) {

++count:

return Counter ( count ):

}

}:

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

int main ( ) {

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

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

++cl:

c2 = ++cl:

// увеличиваем cl // с1-2. c2=2 318_Глава 8. Перегрузка операций

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

return 0;

}

В строке этой программы return Counter ( count ):

происходят все те же действия, которые в программе C0UNTPP2 занимали три строки. Здесь создается объект типа Counter. Он не имеет имени, так как оно нигде не будет использоваться. Этот объект инициализируется значением, полученным в виде параметра count.

Но постойте: требуется ли здесь конструктор с одним аргументом? Да, требуется. Поэтому мы вставили этот конструктор в список методов класса в программе C0UNTPP3.

Counter ( int с ) : count ( с ) { }

Объект, инициализированный значением count, может быть возвращен функцией. Результат работы этой программы тот же, что и программы C0UNTPP2.

В обеих программах использовано создание копии исходного объекта (объекта, для которого вызывается функция), эта копия затем и возвращается функцией. (В другом подходе применяется возврат исходного объекта с использованием указателя this; мы увидим это в главе 11 «Виртуальные функции».)

Постфиксные операции

До сих пор мы применяли операцию увеличения, используя только префиксную запись:

++cl

А как можно использовать постфиксную запись, где переменная увеличивается после того, как ее значение было использовано в выражении?

Cl++

Чтобы иметь возможность работать с двумя версиями операции, мы определим два варианта перегрузки операции ++. Это показано в программе POSTFIX.

// postfix.срр

// префиксная и постфиксная операции ++ для нашего класса !include <iostream> using namespace std: ///////////////////////////////////////////////////////////

class Counter {

private:

unsigned int count: public: Counter ( ) : count ( 0 ) f }

Counter ( int с ) : count ( с ) Перегрузка бинарных операций 319

{ }

unsigned int get_count ( ) { return count; }

Counter operator++ ( ) {

return Counter ( ++count );

}

Counter operator++ ( int ) {

return Counter ( count++ );

}

}:

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

int main ( ) {

Counter cl. c2:

cout « "\ncl = " « cl.get_count ( cout « "\nc2 = " « c2.get_count (

++cl'.

c2 = ++cl;

cout « "\ncl = " « cl.get_count (

cout « "\nc2 = " « c2.get_count (

c2 = Cl++;

cout « "\ncl = " « cl.get_count ( cout « "\nc2 = " « c2.get_count (

return 0;

// определяем переменные // выводим на экран

// увеличиваем cl // cl-2. с2=2

// снова показываем значения

; // и снова « endl;

Теперь у нас есть два типа объявления функции operator++. С одной из них, для префиксной операции, мы уже были знакомы ранее:

Counter operator++ ( ):

Для реализации постфиксной записи операции ++ используем новую функцию:

Counter operator++ ( int );

Различие между этими функциями только в том, что в скобках стоит int. Здесь int не играет роли аргумента и не означает целое число. Это просто сигнал для компилятора, чтобы использовалась постфиксная версия операции. Разработчики С++ нашли полезным повторное использование существующих операций и ключевых слов; в данном случае int предназначена также и для обозначения постфиксной операции. (А сможем ли мы использовать лучший синтаксис?) Результат работы программы будет таким:

cl = О с2 = О cl = 2 с2 - 2 Cl - 3 с2 = 2 320

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

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