Операцію доступу до члена класу можна перевантажити через покажчик (->). Перевантажується він так: operator->(). Функція-член operator->() має повертати покажчик на об'єкт класу. Наприклад:
class MyClass {
public:
int x,y;
MyClass(int_x,int_y){x=_x;y=_y;}
MyClass*operator->();
};
MyClass*MyClass::operator->()
{
x*=2;
y*=2;
cout<<"\nПеревантажений оператор:";
return this;}
У цьому прикладі перевантажена операція подвоює значення полів і видає коротке повідомлення перед тим, як повернути покажчик this. В основній програмі можемо записати:
Main()
{MyClass a(12,25);
cout<<a->x<<'\n';
cout<<a->y<<'\n';
return 0;}
Зазначимо, що в main()- функції перевантажена операція -> уже застосовується не до покажчика на клас, а до екземпляра класу. Якщо описати покажчик на клас і застосувати операцію ->, то викличеться стандартна операція доступу до поля, а не перевантажена. Перевантажені операції працюють лише з екземплярами класів, у яких вони перевантажуються.
Наведені в main -функції операції a->x та a->y виконуються так:
(a.operator->())->x<<"\n";
|
|
(a.operator->())->y<<"\n";
Перевантаження операцій інкремента й декремента
У ранніх версіях С++ неможливо відрізнити постфіксні та інфіксні форми при перевантаженні операцій. Починаючи з версії 4.5, це можна зробити, наприклад, так:
Class MyClass
{int x;
public:
MyClass(int_x){
x=_x;}
int operator++() {
return++x;}
int operator++(int){return x++;}
int operator--(){return--x;}
int operator--(int){return x--;}
Int Getx(void)
{return x;}};
Нехай визначено екземпляр
MyClass v;
Тоді еквівалентними такі конструкції:
v++; та operator++(0)(v);
++v; та operator ++()(v);
main() {
TanyClass t(100);
cout<<t++; //
cout<<++t; //}
Перевантаження операцій керування