Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование.pdf
Скачиваний:
121
Добавлен:
28.03.2015
Размер:
1.58 Mб
Скачать

Класс – абстрактный тип данных

// Класс-друг friend class Tools;

};

class Tools {

//Компонентные данные - все собственные (private) Complex operand1;

Complex operand2; public:

//Компонентные функции - все общедоступные (public)

//Конструктор объектов класса

Tools(Complex a, Complex b) : operand1(a), operand2(b) {}

// Визуализация комплексного числа

 

void print(Complex c)

 

{

 

c.print();

 

}

 

// Класс-друг

 

friend class Complex;

 

};

 

// Сложение комплексных чисел

 

Complex& Complex::add(Tools& t)

 

{

 

re = t.operand1.re + t.operand2.re;

 

im = t.operand1.im + t.operand2.im;

 

return *this;

 

}

 

int main()

 

{

 

Complex x1(-1, 5);

 

Complex x2(10, 7);

 

Complex r;

 

Tools t(x1, x2);

// (-1, 5)

t.print(x1);

t.print(x2);

// (10, 7)

t.print(r.add(t));

// (9, 12)

return 0;

 

}

 

В дальнейшем будет сказано, как ведут себя дружественные классы, если они связаны отношением наследования.

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

Язык С++ позволяет распространить действие стандартных операторов для встроенных типов на новые типы данных, определяемые пользователем (механизм перегрузки или расширение действия стандартных операторов). Механизм перегрузки определяет новое поведение стандартных операторов, это возможно, если хотя бы один операнд для такого оператора является объектом некоторого класса.

77

Основы объектно-ориентированного программирования в примерах на С++

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

Для распространения действия стандартного оператора на тип, определяемый пользователем, необходимо в классе определить специальную функцию, называемую

операторной функцией (от слов operator function).

Формат определения операторной функции:

имя_класса operator оператор(список_формальных_параметров_функции) { тело_функции }

Определенный таким образом оператор называется перегруженным (от слов overloaded operator).

Формат объявления операторной функции:

имя_класса operator оператор(список_формальных_параметров_функции);

Имя операторной функции начинается с ключевого слова operator, за которым непосредственно может следовать сам оператор, например: operator+. Заметим, что между лексемами operator и оператор, как это принято и в других подобных случаях, могут располагаться пробельные разделители, например: operator +.

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

Например, приведем прототипы двух операторных функций для распространения действия бинарных операторов + и на объекты класса Complex:

Complex operator+(Complex, Complex); Complex operator–(Complex);

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

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

Например, приведем фрагмент кода:

Complex

a(-1,

5);

// a.re = -1, a.im = 5

Complex

b(10,

7);

// b.re = 10, b.im = 7

Complex

c = a

+ b;

// c.re = 9,

c.im

= 12

a

=

b

+

c;

 

//

a.re

=

19, a.im = 19

a

=

a

b;

 

//

a.re

=

9,

a.im

= 12

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

Complex c = operator+(a, b);

// c.re = 9, c.im = 12

a

=

operator+(b, c);

// a.re = 19, a.im = 19

a

=

a.operator–(b);

// a.re = 9, a.im = 12

 

 

 

78