|
Программирование >> Дополнительные возможности наследования
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();
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0.001
При копировании материалов приветствуются ссылки. |