В C++ можно перегружать не только функции, но и операции. Таким способом гораздо удобнее вносить какие-либо действия привычным методом записи. Например, можно организовать перемножение матриц с помощью * или сложение комплексных чисел с помощью +.
Для перегрузки операций существует специальное ключевое слово оператор. Рассмотрим конкретный пример
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
MyClass& operator +( MyClass &a, MyClass &b) { MyClass c; int sizeOfArray = a.sizeOfArray+b.sizeOfArray; for (int i = 0; i < sizeOfArray; i++) { if(i < a.sizeOfArray) { c[i] = a[i]; } else { c[i] = b[i]; } } return 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.