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

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


9: 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35

public:

CounterO; Counter(){ }

int GetltsValOconst { return itsVal; } void SetItsVal(int x) { itsVal = x; } void IncrementO { ++itsVal; } void operator++ () { ++itsVal; }

private: int itsVal;

Counter::Counter():

itsVal(O)

int mainO {

Counter i;

cout The value of i is i.GetltsValO endl; i.IncrementO;

1 cout The value of i is i.GetltsValO endl; ++i;

cout The value of i is i.GetltsValO endl; return 0; }

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

i -; В строке 15 перефужается ope rate г++, который затем используется в строке 32. В результате объект класса Counter получает функции, которые можно бьшо ожидать судя по его названию. Далее объекту сообщаются дополнительные возможности, призванные повысить эффективность его использования, в частности возможность контроля за максимальным значением, которое нельзя превышать в ходе приращения.

Но в работе перефуженного оператора инкремента существует один серьезный недостаток. В данный момент в профамме не удастся выполнить следующее выражение:

Counter а = ++1;

В этой строке делается попытка создать новый объект класса Counter - а, которому присваивается приращенное значение переменной i. Хотя встроенный конструктор-копировщик поддерживает операцию присваивания, текущий оператор инкремента не возвращает объект класса Counter. Сейчас он возвращает пустое значение void. Невозможно присвоить значение void объекту класса Counter. (Невозможно создать что-то из ничего!)



Типы возвратов пврвгружвнпых функции опвраторов

Все, что нам нужно, - это возвратить объект класса Counter таким образом, чтобы его можно было присвоить другому объекту класса Counter. Как это сделать? Один подход состоит в том, чтобы создать временный объект и возвратить его. Он показан в листинге 10.9.

Аисшииг 10.9. Возоращвние аременного оОъекта

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41

Листинг 10.9.

Возвращение временного объекта int

ffinclude <iostream.h>

class Counter (

public:

CounterO; -Counter(){ }

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

private: int itsVal;

>

Counter::Counter():

itsVal(O)

Counter Counter: :operator++0 {

++itsVal; Counter temp; temp.SetltsVal(itsVal); return temp;

>

int mainO {

Counter i;

cout The value of i is i.GetltsValO endl i.IncrementO;

cout The value of i is i.GetltsValO endl ++i;

cout The value of i is I.GetltsValO endl



Counter a =

cout The value of a: a.GetItsVal(); cout and i: I.GetltsValO endl; return 0;

The value of i is 0 The value of i is 1 The value of i is 2 The value of a: 3 and i: 3

В данной версии профаммы operator++ объявлен в сфоке 15 таким образом, что может возвращать объекты класса Counter. В строке 29 создается временный объект temp, и ему присваивается значение текущего объекта Counter. Значение временной переменной возвращается и тут же, в строке 42, присваивается новому объекту а.

Возвращение Оезымянных временных оОъектов

В действительности нет необходимости присваивать имя временному объекту, как это было сделано в предыдущем листинге в строке 29. Если в классе Counter есть принимающий значение конструктор, то параметру этого конструктора можно просто присвоить значение возврата оператора инкремента. Эта идея реализована в листинге 10.10.

Апстинг 10.10. ВпзвращЕние безымяннпгп времеиипгп пбъекта

2 3 4 5 6 7 8 9

10 11 12 13 14 15 16 17 18 19 20 21 22 23

Листинг 10.10.

Возвращение безымянного временного объекта int

#include <iostream.h>

class Counter {

public:

CounterO; Counter(int val); -Counter(){ }

int GetltsValOconst { return itsVal; } void SetItsVal(int x) { itsVal = x; } void IncrementO { ++itsVal; } Counter operator++ ();

private; int itsVal;

Counter;;Counter();



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

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