Листинг 10.7. Добавление в класс оператора инкремента



1: // Листинг 10.7.

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

3:

4: int

5: #include <iostream.h>

6:

7: class Counter

8: {

9: public:

10: Counter();

11: ~Counter(){ }

12: int GetItsVal()const { return itsVal; }

13: void SetItsVal(int x) { itsVal = x; }

14: void Increment() { ++itsVal; }

15:

16: private:

17: int itsVal;

18:

19: };

20:

21: Counter::Counter():

22: itsVal(0)

23: { }

24:

25: int main()

26: {

27: Counter i;

28: cout << "The value of i is " << i.GetItsVal() << endl;

29: i.Increment();

30: cout << "The value of i is " << i.GetItsVal() << endl;

31: return 0;

32: }

 

Результат:

The value of i is 0

The vglue of i is 1

 

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

 

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

 

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

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

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

void operator++ ()

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

Листинг 10.8 Перегрузка оператора преинкремента

1: // Листинг 10.8.

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

3:

4: int

5: #include <iostream.h>

6:

7: class Counter

8: {

9: public:

10: Counter();

11: ~Counter(){ }

12: int GetItsVal()const { return itsVal; }

13: void SetItsVal(int x) { itsVal = x; }

14: void Increment() { ++itsVal; >

15: void operator++ () < ++itsVal; }

16:

17: private:

18: int itsVal;

19:

20: };

21:

22: Counter::Counter():

23: itsVal(0)

24: { }

25:

26: int main()

27: {

28: Counter i;

29: cout << "The value of i is " << i.GetItsVal() << endl;

30: i.Increment();

31: i cout << "The value of i is " << i.GetItsVal() << endl;

32: ++i;

33: cout << "The value of i is " << i.GetItsVal() << endl;

34: return 0;

35: }

 

Результат:

The value of i is 0

The value of i is 1

The value of i is 2

 

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

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

Counter а = ++i;

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

 

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

 

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

Листинг 10.8. Возвращение временного объекта

1: // Листинг 10.9.

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

3:

4: int

5: #include <iostream.h>

6:

7: class Counter

8: {

9: public:

10: Counter();

11: ~Counter(){ }

12: int GetItsVal()const { return itsVal; }

13: void SetItsVal(int x) { itsVal = x; }

14: void Increment() { ++itsVal; }

15: Counter operator++ ();

16:

17: private:

18: int itsVal;

19:

20: };

21:

22: Counter::Counter():

23: itsVal(0)

24: { }

25:

26: Counter Counter::operator++()

27: {

28: ++itsVal;

29: Counter temp;

30: temp.SetItsVal(itsVal);

31: return temp;

32: }

33:

34: int main()

35: {

36: Counter i;

37: cout << "The value of i is " << i.GetItsVal() << endl;

38: i.Incrernent();

39: cout << "The value of i is " << i.GetItsVal() << endl;

40: ++i;

41: cout << "The value of i is " << i.GetItsVal() << endl;

42: Counter а = ++i;

43: cout << "The value of a: " << a.GetItsVal();

44: cout << " and i: " << i.GetItsVal() << endl;

45: return 0;

46: }

 

Результат:

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 создается временный объект ternp, и ему присваивается значение текущего объекта Counter. Значение временной переменной возвращается и тут же, в строке 42, присваивается новому объекту а.

 


Дата добавления: 2019-02-12; просмотров: 249; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!