{ int x,y; // декартовы координаты точки
public:
...
int read_x(); // возвращает компоненту x
int read_y(); // возвращает компоненту y
void write_x(int); // модифицирует компоненту x
void write_y(int); // модифицирует компоненту y
...
};
int dek_koord::read_x(){return x;}
int dek_koord::read_y(){return y;}
void dek_koord::write_x(int a){x=a;}
void dek_koord::write_y(int a){y=a;}
dek_koord operator*(dek_koord a,dek_koord b) // перегрузка операции *
{ dek_koord tmp; // функция operator − глобальная
tmp.write_x(a.read_x()*b.read_x());
tmp.write_y(a.read_y()*b.read_y());
return tmp;
}
В глобальной функции operator* доступ к private данным локального объекта tmp возможен через public-функции этого объекта, либо данные класса должны иметь атрибут public, что не отвечает принципу инкапсуляции. Кроме того, если функция operator является friend-функцией некоторого класса, то она имеет доступ к private-компонентам этого класса. Это будет рассмотрено несколько ниже.
Далее приведен пример еще одной программы перегрузки оператора «-» для использования его при вычитании из одной строки другой.
#include <iostream>
using namespace std;
#include <string.h>
Class String
{ char str[80]; // локальная компонента
public: // глобальные компоненты
void init (char *s); // функция инициализации
int operator - (String s_new); // прототип функции operator
} my_string1, my_string2; // описание двух объектов класса String
void String::init (char *s) // функция обеспечивает копирование
// строки аргумента(s) в строку-компоненту
{ strcpy(str,s);} // (str) класса String
int String::operator - (String s_new) // перегрузка оператора – (вычитания
// строк)
{ for (int i=0; str[i]==s_new.str[i]; i++)
if (!str[i]) return 0;
return str[i] - s_new.str[i];
}
int main()
{ char s1[51], s2[51];
cout <<"Введите первую строку (не более 80 символов):" <<endl;
cin >>s1;
cout<<" Введите вторую строку (не более 80 символов): "<<endl;
cin>>s2;
my_string1.init(s1); //инициализация объекта my_string1
my_string2.init(s2); //инициализация объекта my_string2
cout <<"\nString1 - String2 = "; // вывод на экран разности двух строк
cout << my_string1 - my_string2 << endl;
return 0;
}
Результат работы программы:
Введите первую строку (не более 80 символов):
overload
Введите вторую строку (не более 80 символов):
function
String1 – String2 = 9
При перегрузке бинарного оператора с использованием компоненты-функции ей передается в качестве параметра только один аргумент. Второй аргумент получается посредством использования неявного указателя this на объект, компоненты которого модифицируются.