В C++ можно перегружать не только функции, но и операции. Таким способом гораздо удобнее вносить какие-либо действия привычным методом записи. Например, можно организовать перемножение матриц с помощью * или сложение комплексных чисел с помощью +.
Для перегрузки операций существует специальное ключевое слово оператор. Рассмотрим конкретный пример
В данном примере мы перегружаем оператор +, заставляя его складывать 2 переменных класса MyClass заданным нами образом. В итоге, если в классе встретится конструкция a+b, где a и b – экземпляры MyClass, то операция будет совершаться, как показано выше в примере. Во всех остальных случаях оператор + будет выполняться обычным образом.
На такую перегрузку действует ряд ограничений :
- Перегружать можно только уже используемые операторы. Нельзя ввести новые.
- Нельзя перегрузить операторы для уже существующих типов данных, так, например, нельзя перегрузить сложение целых чисел.
- Нельзя изменять синтаксис операций – из унарной делать бинарную, менять место оператора в выражении.
- Ряд символов перегрузить нельзя: . , .* , ?: , :: , sizeof и #.
А что насчет перегрузки операторов ввода/вывода? Я сейчас изучаю раздел о перегрузке сin и cout. Не очень понятно, как это работает, если использовать в перегруженной операции объекты ostream и istream (передача параметров - по ссылке).
Для этого используют друзей. В классе пишут:
friend ostream& operator<<(ostream& cout, MyClass& MyClass);
friend istream& operator>>(istream& cin, MyClass& MyClass);
и пишут вне классов глобально:
ostream& operator<<(ostream& cout, MyClass& MyClass)
{
cout<<sizeOfArray;//и т.д.
return cout;
}
istream& operator>>(istream& cin, MyClass& MyClass)
{
cin>>sizeOfArray;//и т.д.
return cin;
}
Операции можно перегружать только для нового типа данных - нельзя перегрузить оперецию для встроенного типа.
В С++ новый тип данных можно образовать с помощью конструкций enum, union,struct и class.