Программирование >>  Дополнительные возможности наследования 

1 ... 87 88 89 [ 90 ] 91 92 93 ... 265


varOne: 2 varTwo: 4 varThree: 6

функция Add() объявляется в строке 15. В функции задана константная - ссъитка на Counter, представляющая число, которое нужно добавить к текущему объекту. Функция возвращает объект класса Counter, представляющий собой результат суммирования, который присваивается операнду слева от оператора присваивания (=), как показано в строке 38. Здесь переменная varOne является объектом, varTwo - параметр функции Add(), а varThree - адресный операнд, которому присваивается результат суммирования.

Чтобы создать объект varThree без исходной инициализации каким-либо значением, используется конструктор, заданный по умолчанию. Он присваивает объекту varThree нулевое значение, как показано в строках 22-24. Иначе эту проблему можно бьито рещить, присвоив нулевое значение конструктору, определенному в строке 11.

Перегрузка оператора суммпроеаипя

Тело функции Add() показано в строках 30-33. Профамма работает, но несколько замысловато. Перефузка оператора суммирования (+) сделала бы работу класса Counter более гармоничной (листинг 10.14).

Aucmuoz 10.14. Пврвгрузка опвратира суммирования

12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27

Листинг 10.14.

Перегрузка оператора суммирования (+) int

ffinclude <iostream.h>

class Counter {

public:

CounterO;

Counter(int initialValue); CounterO! }

int GetltsValOconst { return itsVal; } void SetltsVaKint x) { itsVal = x; } Counter operator+ (const Counter &); private:

int itsVal;

Counter::Counter(int initialValue):

itsVal(initialValue)

Counter::Counter():

itsVal(O)

{ >



28 29 30 31 32 33 34 35 36 37 38 39 40 41 42

Counter Counter::operator+ (const Counter & rhs) {

return Counter(itsVal + rhs.GetltsValO);

int mainO {

Counter var0ne(2), varTwo(4), varThree;

varThree = varOne + varTwo; cout varOne: varOne. GetltsVaK) endl; cout varTwo: varTwo.GetItsVal() endl; cout varThree: varThree.GetItsVal() endl;

return 0; }

varOne: 2 va rTwo: 4 varThree: 6

В строке 15 объявлен оператор суммирования (operator+), функция которого определяется в строках 28-31. Сравните эту функцию с объявлением и определением функции Add() в предьщущем листинге. Они почти идентичны. В то же время далее в программе эти функции используются совершенно по разному. Посмотрите, следующая запись с оператором (+) выглядит естественней и понятнее varThree = varOne + varTwo;

чем строка с функцией Add(): varThree = varOne.Add(varTwo);

Для компилятора различия не принципиальные, но программа при этом становится более понятной и читабельной, что облегчает работу программиста.

Примечание

Метод, используемый для перегрузки оператора суммирования (operator++), можно применять также с другими операторами, например, оператором вычитания (operator--).

Перегрузка операторов с увумя операпуами

Операторы с двумя операндами объявляются так же, как и операторы с одним операндом, за исключением того, что функции этих операторов содержат параметры. Параметры представляют собой константные ссылки на объекты таких же типов.

Пример перегрузки оператора суммирования для класса Соиш-:--:

Counter Counter::operator+ (const Counter & rhs);

Пример перегрузки операторавычитания для этого же класса:

Coffliter Counter: loperatarrSiconst Counter & rhs);



Основные нронцнпы пврвгрузкн впвратврвв

Перегруженные операторы могут быть функциями-членами, как в примерах этой главы, либо задаваться функциями-друзьями, не принадлежащими классу. Более подробно такие операторы будут рассматриваться на занятии 14 во время изучения специальных классов и функций.

Ряд операторов могут быть исключительно членами класса. Это операторы присваивания (=), индексирования ([]), вызова функции (()) и косвенного обращения к члену класса (->).

Оператор индексирования [ ] будет рассмотрен на следующем занятии, а оператор косвенного обращения к члену класса - на занятии 14 во время изучения дополнительных возможностей указателей.

Ограннчвння пвреерузкн впвратврвв

Нельзя перегружать операторы стандартных типов данных (такие как int). Также нельзя изменять установленные приоритеты и ассоциативности операторов. Например, нельзя оператор с одним операндом перефузить так, чтобы использовать его с двумя операндами. Кроме того, методом перефузки нельзя создавать новые операторы; например, бинарный оператор умножения ( ) не удастся объявить как оператор возведения в квадрат.

Количество операндов, которыми может манипулировать оператор, - важная характеристика каждого оператора. Различают операторы, используемые с одним операндом (например, оператор инкремента: myValue++), и операторы, для работы которых необходимо указать два операнда (например, оператор суммирования: а+Ь). Сразу фе-мя операндами управляет только условный оператор ?, синтаксис использования которого показан в следующем примере: (а > b ? х : у).

Чтв можнв перегружать

Возможность перефузки операторов - это то новое средство профаммирования, предоставляемое С++, которое наиболее щироко используют (а часто и злоупотребляют им) начинающие программисты. Новичков захватывает азарт присвоения новых интересных функций самым обычным и заурядным операторам. В результате код профаммы может оказаться непонятным и нечитабельным даже для создателя, а не то что для другого профаммиста.

Безусловно, если в программе оператор + начнет осуществлять вычитание, а оператор . - суммирование, это может тещить самолюбие начинающего программиста, но профессионал никогда такого не допустит. Вполне можно понять желание использовать оператор + для конкатенации строк и символов, а оператор / для разделения строк, но такая перегрузка операторов таит в себе подводные рифы, на которые может совершенно неожиданно напороться программа во время выполнения. Возможно, было бы не плохо уделить больше внимания особенностям использования перегруженных операторов, но еще лучше начать с формулировки основных предостережений. Прежде всего следует помнить, что основная цель перегрузки операторов состоит в том, чтобы сделать программу эффективнее, а ее код проще и понятнее.



1 ... 87 88 89 [ 90 ] 91 92 93 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика