Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Либерти Джесс. Освой самостоятельно С++ за 21 день. - royallib.ru.rtf
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
2.55 Mб
Скачать

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

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

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, присваивается новому объекту а.