Программирование >>  Расширенная версия языка c++ 

1 ... 54 55 56 [ 57 ] 58 59 60 ... 227


Кроме того, нельзя перегружать оператор цессора. (Оператор .* является сугубо специальным и в книге не рассматривается.)

что в C++ понятие оператора трактуется очень широко: в это понятие входят оператор индексирования [], оператор вызова функции (), операторы new и delete, операторы . (точка) и -> (стрелка). Однако в данной главе мы коснемся более обычных операторов.

Оператор-функции, за исключением оператора наследуются производным классом. Тем не менее для производного класса тоже можно перегрузить любой выбранный оператор (включая операторы, уже перегруженные в базовом классе).

Вы уже пользовались двумя перегруженными операторами: и которые перегружались для реализации ввода/вывода Как уже упоминалось, перегрузка этих операторов для реализации ввода/вывода не мешает им вгполнять свои традиционные функции левого и правого сдвига.

Хотя допустимо иметь оператор-функцию для реализации любого действия -связанного или нет с традиционным употреблением оператора - л\<гиг если действия перегружаемых операторов остаются в сфере их традиционного использования. При создании перегружаемых операторов, для которых этот принцип не поддерживается, имеется риск существенного снижения читабельности программ. Например, перегрузка оператора / так, чтобы 300 раз

записать в дисковый файл фразу Мне нравится C++ , является явным злоупотреблением перегрузкой операторов.

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

И последнее -функции не могут иметь параметров по умолчанию.

сто знака # нужно подставить перегружаемый оператор. Например, если перегружается оператор +, то у функции должно быть имя operator+. Содержание списка список-аргументов зависит от реализации оператор-функции и от типа перегружаемого оператора.

Следует запомнить два важных ограничения на перегрузку операторов. Во-первых, нельзя менять приоритет операторов. Во-вторых, нельзя менять число операндов оператора. Например, нельзя перегрузить оператор / так, чтобы в нем использовался только один операнд.

Большинство операторов C++ можно перегружать. Ниже представлены те несколько операторов, которые перегружать нельзя:



6.2. Перегрузка бинарных операторов

Когд функция - член класса перегружает бинарный оператор, у

функции будет только один параметр. Этот параметр получит тот объект, который расположен справа от оператора. Объект слева генерирует вызов оператор-функции и передается неявно, с помощью указателя this.

Важно что для написания имеется множество

вариантов. Примеры, показанные здесь и в других местах главы, не являются исчерпывающими, хотя они иллюстрируют несколько наиболее общих технических приемов.

; Примеры

1. В следующей программе перегружается оператор + относительно класса coord. Этот класс используется для поддержания координат X, Y.

Перегрузка атора 4 относительно класса coord

tinclude <iostream>

using namespace std; * -

class coord { , .

in y; значения координат ! . .

public:

coord 0 { x = 0; y= 0; }

coord(int i, int j) { X = i; у = j; }

voi (int &i in ij ) { i = x; j = y; }

coor (coord ob2J ;

>;

Перегрузка оператора + относительно класса coord coord coord::operator+(coord ob2) .

coord temp; ...

. temp.x = X +ob2.x; . , .

temp, у = у +оЬ2.у; .

return temp;

int main () i ,

- coor ol (10, 10) (5, 3), o3,- .

int x, y; . , . -

o3 = ol сложение объектов

вызов функции operator+ ()



o3.get xy(x, у); -./-V ,>--.;iir- . .

cout (01 + о2) х , у Xn ; У;, ;. :

return 0;

-.<: -

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

(о1 + о2) X: 15, Y: 13 ,. .

Давайте внимательно рассмотрим программу. Функции mtor+() возвращает объект типа coord, в котором сумма координат по оси X находится в переменной а сумма координат по оси Y - в переменной у. Отметьте, что временный объект temp используется внутри функции operator+() для хранения результата и является возвращаемым объектом. Отметьте также, что ни один из операндов не меняется. Назначение переменной temp легко понять.

В данной ситуации (как и в большинстве ситуаций) оператор + был перегружен способом, аналогичным своему традиционному арифметическому использованию. Поэтому и было важно, чтобы ни один из операндов не менялся. Например, когда вы складываете 10+4, результат равен 14, но ни 10, ни 4 не меняются. Таким образом, временный объект необходим для хранения результата.

Смысл того, что функции tor+O возвращает объект типа coord, состоит в том, что это позволяет использовать результат сложения объектов типа coord в сложном выражении. Например, инструкция

оЗ = ol + о2;

правильна только потому, что результат выполнения операции ol + о2 является объектом, который можно присвоить объекту оЗ. Если бы возвращае-мгм значением бгл объект другого типа, то эта инструкция бгла бы неправильна. Более того, возвращая объект типа coord, оператор сложения допускает возможность существования строки, состоящей из нескольких сложений. Например, следующая инструкция вполне корректна:

оЗ = ol + о2 + ol + оЗ;

Хотя у вас будут ситуации, в которых понадобится -функция, возвращающая нечто иное, чем объект класса, для которого она определена, большинство создаваемых вами оператор-функций будут возвращать именно такие объекты. (Основное исключение из этого правила связано с перегрузкой операторов отношения и логических операторов. Эта ситуация исследуется в разделе 6.3 Перегрузка операторов отношения и логических операторов далее в этой главе.)

Последнее замечание по этому примеру. Поскольку объект типа coord является возвращаемым значением оператор-функции, то следующая инструкция также совершенно правильна:

(ol 4 .get xy(x, у); :



1 ... 54 55 56 [ 57 ] 58 59 60 ... 227

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