- •ПЕРЕГРУЗКА ОПЕРАЦИЙ
- •Можно перегружать:
- •При создании описания класса существует две возможности определения операций:
- •Если унарная перегруженная операция реализована как метод класса, то у него нет параметров.
- •void operator-(Complex c1);
- •Например, X::operator T() – преобразует X в T.
- •Примечание.
- •int main()
- •tiny tiny::operator--(int){ v--;
- •Большие объекты
- •Указатели для этой цели использовать нельзя, т.к. невозможно переопределить интерпретацию операции, если она
- •Пример. Определение класса string.
- •string::string(const string& a)
- •delete s2; delete s1; delete s; return 0;
Например, X::operator T() – преобразует X в T.
Пример. Объявление и использование класса tiny для работы с целыми числами в диапазоне 0..63.
class tiny { char v;
void assign(int i); //функция для проверки
попадания i в диапазон 0..63 public:
tiny(int i) { assign(i); }
tiny(const tiny& t) { v = t.v; } // конструктор копирования
tiny& operator=(const tiny& t) { v = t.v;
return *this;
}
tiny& operator=(int i) { assign(i);
return *this;
}
operator int() { return v; }
};
void tiny::assign(int i) { if (i>63) {
printf("выход из диапазона\n"); v=i&~192;
}
else if(i<0) {
printf("выход из диапазона\n"); v=0;
}
else v=i;
}
Примечание.
Операция «~» - дополнение до 1 (побитовая операция НЕ).
Для 192:
192 = 11000000; ~192=00111111.
Для i=66: i&~192=01000010&00111111=00000010=2.
i&~192 ≡ i&63 (в данном случае).
int main()
{
tiny c1 = 2; // tiny(int i) при i=2 tiny c2 = 62; // tiny(int i) при i=62
tiny c3 = c2-c1; // tiny(int i) при i=с2.operator int()-c1.operator int())
tiny c4 = c3; // tiny(const tiny& t) при t=c3 printf("c1=%d c2=%d c3=%d c4=%d\n\n", c1,
c2, c3, c3);
int i = c1+c2;
//с1.operator int()+c2.operator int() printf("i=%d\n\n",i);
c1=c2+2*c1;
//c1.operator =(int i) при i= c2.operator int() + 2 * c1.operator int()
printf("c1=%d\n\n",c1);
c2 = c1 - i; printf("c2=%d\n\n",c2);
c3 = c2;
//c1.operator =(const tiny& t) при t=c2 printf("c3=%d\n\n",c3);
return 0;
}
Перегрузка ++ и --
Префиксная форма:
Xoperator++(); Постфиксная форма:
Xoperator++(int);
Пример. Добавление в класс tiny для инкремента и декремента
class tiny {...
tiny operator++(); tiny operator++(int); tiny operator--(int);
};
tiny tiny::operator++() { v++;
assign(v); return *this;
}
tiny tiny::operator++(int) { v++;
assign(v); tiny temp(v); return temp;
}
tiny tiny::operator--(int){ v--;
assign(v); tiny temp(v); return temp;
}
int main() { setlocale(0,"RUS"); tiny c3=20;
printf("c3=%d\n\n",c3); c3--;
//компилятор генерирует вызов функции c3.operator--(0);
++c3;
//компилятор генерирует вызов функции c3.operator++();
printf("c3=%d\n\n",c3);
c3++;
//компилятор генерирует вызов функции c3.operator++(0);
printf("c3=%d\n\n",c3); return 0;
}