Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Янг Майкл Дж. -> "Visual С++ 6. Полное руководство: В 2 т.(том1)" -> 53

Visual С++ 6. Полное руководство: В 2 т.(том1) - Янг Майкл Дж.

Янг Майкл Дж. Visual С++ 6. Полное руководство: В 2 т.(том1) — Бином, 2006. — 569 c.
Скачать (прямая ссылка): vicualcc2006t1.djvu
Предыдущая << 1 .. 47 48 49 50 51 52 < 53 > 54 55 56 57 58 59 .. 204 >> Следующая

Подобно стандартной операции сложения, выражение, содержащее более одного перегруженного оператора "+", вычисляется слева направо. Например, следующая программа использует перегруженный оператор для сложения величин, хранимых в трех объектах класса Ccurrency.
void main () {
CCurrency Advertising (235, 42); CCurrency Rent (823, 68); CCurrency Entertainment (1024, 32) CCurrency Overhead;
Overhead = Advertising + Rent + Entertainment;
Overhead.PrintAmount();
>
Функцию operator* можно упростить, заменив локальный временный объект класса CCurrency неявным временным объектом.
CCurrency operator* (CCurrency Curr) {
return CCurrency (Dollars + Curr.Dollars, Cents + Curr.Cents); }
При вызове конструктора класса компилятор из выражения создает временный объект класса. Функция operator* непосредственно возвращает содержимое этого временного объекта. Далее, в параграфе "Конструкторы копирования", описано, как объекты класса возвращаются функциями.
Функцию operator* можно реализовать более эффективно, передавая ей ссылку на объект класса CCurrency, а не сам объект. Передача ссылок исключает необходимость копирования объекта в локальный параметр, что особенно важно для объектов больших размеров (см. гл. 3). Следующий фрагмент программы является окончательной версией функции operator*.
CCurrency operator* (const CCurrency SCurr)
{
return CCurrency (Dollars + Curr.Dollars, Cents + Curr.Cents); }
Использование спецификатора const при объявлении параметра — гарантия того, что функция не изменит значение параметра.
Определение
дополнительных функц ий-операторов
Подобно другим функциям языка С++, функции-операторы могут быть перегружены. При этом есть несколько способов вызова операторов. Например, с помощью оператора "+" можно сложить объект класса CCurrency с константой типа int или long. (В определенной выше функции предполагается, что оба операнда являются объектами класса CCurrency.) Для этого в класс CCurrency нужно добавить следующую функцию.
CCurrency operator* (long Dol) {
return CCurtency (Dollars + Dol, Cents); 1
Включение этой функции позволит использовать оператор "+" следующим образом. CCurrency Advertising (235, 42); // ...
Advertising = Advertising + 100;
Компилятор будет интерпретировать выражение Advertising + 100 как
Advertising.operator* (100)
и, следовательно, вызывать вновь определенную версию функции operator*. Тем не менее, целочисленную константу нельзя поставить первой, так как компилятор будет интерпретировать выражение 100 + Advertising как
100.operator* (Advertising) // бессмысленно!
Чтобы обойти это ограничение, можно написать функцию-оператор, которая не является членом класса, но первый параметр которой имеет тип long.
// определяется глобально:
CCurrency operator* (long Dol, const CCurrency &Curr) {
return CCurrency (Dol + Curr.Dollars, Curr.Cents); }
Но при использовании этой функции также могут возникнуть проблемы. Так как она не является функцией-членом класса CCurrency, то не имеет доступа к
закрытым переменным этого класса (а именно, к Dollars и Cents). Для получения такого доступа функцию нужно сделать дружественной классу CCurrency, объявив ее внутри определения CCurrency с использованием спецификатора friend.
class CCurrency {
// другие объявления ...
friend CCurrency operator* (long Dol, const CCurrency SCurr); // другие объявления ... };
Даже если дружественная функция не является функцией-членом класса, она имеет доступ как к закрытым, так и к защищенным членам класса, который объявляет ее дружественной.
Когда такая функция-оператор определена, операцию сложения можно применить следующим образом.
CCurrency Advertising (235, 42); // ...
Advertising = 100 + Advertising;
Теперь компилятор проинтерпретирует выражение 100 + Advertising как
operator* (100, Advertising)
и, следовательно, вызовет дружественную версию функции-оператора.
Заметим: можно сделать дружественными две первые версии функции operator*, не определяя их как функции-члены класса (хотя особенного преимущества это не дает).
friend CCurrency operator* (const CCurrency &Currl,
const CCurrency &Curr2); friend CCurrency operator* (const CCurrency SCurr, long Dol);
Функция, перегружающая оператор и не являющаяся методом класса, должна иметь хотя бы один параметр — объект класса. Следовательно, функцию-оператор нельзя использовать для изменения стандартного смысла операторов в выражении, содержащем только данные встроенных типов.
Дружественные классы
В определении класса также можно объявить дружественным другой класс, например:
class А {
// ...
friend class FriendOfA;
// ...
};
Благодаря такому объявлению любая функция-член класса FriendOfA имеет доступ к закрытым и защищенным членам класса А.
Ниже приведено полное описание класса CCurrency вместе с функцией, не являющейся его членом.
#include <iostream.h>
class CCurrency
{
private :
long Dollars; int Cents;
public :
CCurrency () {
Dollars = Cents = 0; }
CCurrency (long Dol, int Cen) {
SetAmount (Dol, Cen); }
Предыдущая << 1 .. 47 48 49 50 51 52 < 53 > 54 55 56 57 58 59 .. 204 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100