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

Перегрузка операторов

Язык C++ располагает рядом встроенных типов данных, включая int, real, char и т.д. Для работы с данными этих типов используются встроенные операторы — суммирования (+) и умножения (<<). Кроме того, в C++ сушествует возможность добавлять и перегружать эти операторы для собственных классов.

Чтобы в деталях рассмотреть процедуру перегрузки операторов, в листинге 10.6 создается новый класс Counter. Объект класса Counter будет использоваться в других приложениях для подсчета циклов инкрементации, декрементации и других повторяющихся процессов.

Листинг 10.6. Класс Counter

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

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:

15:   private:

16:     int itsVal;

17:

18: };

19:

20: Counter::Counter():

21: itsVal(0)

22: { }

23:

24: int main()

25: {

25:    Counter i;

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

28:    return 0;

29: }

Результат:

The value of i is 0

Анализ: Судя по определению в строках программы с 7 по 18, это совершенно бесполезный класс. В нем объявлена единственная переменная-член типа int. Конструктор по умолчанию, который объявляется в строке 10 и выполняется в строке 20, инициализирует переменную-член нулевым значением.

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

Запись Функции инкремента

 Ограничения использования объекта нового класса, которые упоминались выше, можно преодолеть путем перегрузки операторов. Например, существует несколько способов восстановления возможности приращения объекта класса Counter. Один из них состоит в том, чтобы перегрузить функцию инкрементации, как показано в листинге 10.7.

Листинг 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, но это можно реализовать другим способом.