Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

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

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

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

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

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

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

3:

4: int

5: #include <iostream.h>

6:

7: class Counter

8: {

9: public:

10: Counter;

11: Counter(int val);

12: ~Counter{ }

13: int GetItsValconst { return itsVal; }

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

15: void Increment { ++itsVal; }

16: Counter operator++ ;

17:

18: private:

19: int itsVal;

20:

21: };

22:

23: Counter::Counter:

24: itsVal(0)

25: { }

26:

27: Counter::Counter(intval):

28: itsVal(val)

29: { }

30:

31: CounterCounter::operator++

32: {

33: ++itsVal;

34: return Counter (itsVal);

35: }

36:

37: int main

38: {

39: Counter i;

40: cout << "The value of i is" << i.GetItsVal << endl;

41: i.Increment;

42: cout << "The value of i is" << i.GetItsVal << endl;

43: ++i;

44: cout << "The value of i is" << i.GetItsVal << endl;

45: Counter a = ++i;

46: cout << "The value of a: " << a.GetItsVal;

47: cout << " and i: " << i.GetItsVal << endl;

48: return 0;

49: }

Результат:

The value of i is 0

The value of i is 1

Поделиться:
Популярные книги

На границе империй. Том 9. Часть 2

INDIGO
15. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 2

Ваше Сиятельство 5

Моури Эрли
5. Ваше Сиятельство
Фантастика:
городское фэнтези
аниме
5.00
рейтинг книги
Ваше Сиятельство 5

Инженер Петра Великого 2

Гросов Виктор
2. Инженер Петра Великого
Фантастика:
попаданцы
альтернативная история
фэнтези
5.00
рейтинг книги
Инженер Петра Великого 2

Довлатов. Сонный лекарь 3

Голд Джон
3. Не вывожу
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь 3

А жизнь так коротка!

Колычев Владимир Григорьевич
Детективы:
криминальные детективы
8.57
рейтинг книги
А жизнь так коротка!

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Темный Лекарь 3

Токсик Саша
3. Темный Лекарь
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Темный Лекарь 3

Росток

Ланцов Михаил Алексеевич
2. Хозяин дубравы
Фантастика:
попаданцы
альтернативная история
фэнтези
7.00
рейтинг книги
Росток

На границе империй. Том 3

INDIGO
3. Фортуна дама переменчивая
Фантастика:
космическая фантастика
5.63
рейтинг книги
На границе империй. Том 3

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Мастер 7

Чащин Валерий
7. Мастер
Фантастика:
фэнтези
боевая фантастика
попаданцы
технофэнтези
аниме
5.00
рейтинг книги
Мастер 7

Отверженный VIII: Шапка Мономаха

Опсокополос Алексис
8. Отверженный
Фантастика:
городское фэнтези
альтернативная история
аниме
5.00
рейтинг книги
Отверженный VIII: Шапка Мономаха

Кодекс Охотника. Книга XVI

Винокуров Юрий
16. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVI

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7