Главная » Статьи » Програмування » C++ [ Добавить статью ]

RUS Уроки по программированию на языке С++ (Перегрузка операторов.)

Перегрузка операторов.

В С++ есть возможность распространения действия стандартных операций на операнды абстрактных типов данных. Для того, чтобы переопределить одну из стандартных операций для работы с операндами абстрактных типов, программист должен написать функцию с именем operator знак, где знак - обозначение этой операции (например, + - | += и т.д.).

Однако в языке существует несколько ограничений, накладываемых на переопределение операторов:

  1. Нельзя создавать новые символы операций.
  2. Нельзя переопределять операции:
    ::
    * (разыменование, а не бинарное умножение)
    ?: 
    sizeof
    ## 
    #
    .
    
  3. Cимвол унарной операции не может использоваться для переопределения бинарной операции и наоборот. Например, символ << можно использовать только для бинарной операции, ! - только для унарной, а & - и для унарной, и для бинарной.
  4. Переопределение операций не меняет ни их приоритетов, ни порядка их выполнения (слева направо или справа налево).
  5. При перегрузке операции компьютер не делает никаких предположений о ее свойствах. Это означает, что если стандартная операция += может быть выражена через операции + и =, т.е. а + = b эквивалентно а = а + b, то для переопределения операций в общем таких соотношений не существует, хотя, конечно, программист может их обеспечить.
  6. Никакая операция не может быть переопределена для операндов стандартных типов.
  7. Как для унарной, так и для бинарной операции число аргументов функции operator () должно точно соответствовать числу операндов этой операции. Причем в перегрузку бинарного оператора принято передавать один аргумент, так как второй - неявный. Его имеет любая функция - член класса, это тот самый указатель this - указатель на объект, для которого вызван метод. Таким образом, в переопределение унарного оператора не следует передавать ничего вовсе.
Примечание: Кстати!! Удобно передавать значения параметров в функцию operator() не по значению, а по ссылке.
Пример.
#include <iostream>

using namespace std;
class Digit{
 private:
 int dig; // число
 public:
 Digit(){
 dig=0;
 }
 Digit(int iDig){
 dig=iDig;
 }
 void Show(){
 cout<<dig<<"\n";
 }

 // перегружаем четыре оператора
 // обратите внимания, все операторы
 // бинарные, поэтому мы передаем в
 // них один параметр - это операнд,
 // который будет находиться справа
 // от оператора в выражении
 // левый операнд передается с помощью this
 Digit operator+(const Digit &N)
 {
 Digit temp;
 temp.dig=dig+N.dig;
 return temp;
 }
 Digit operator-(const Digit &N)
 {
 Digit temp;
 temp.dig=dig-N.dig;
 return temp;
 }
 Digit operator*(const Digit &N)
 {
 Digit temp;
 temp.dig=dig*N.dig;
 return temp;
 }
 Digit Digit::operator%(const Digit &N)
 {
 Digit temp;
 temp.dig=dig%N.dig;
 return temp;
 } 
};
void main()
{
 // проверяем работу операторов
 Digit A(8),B(3);
 Digit C;

 cout<<"\Digit A:\n";
 A.Show();

 cout<<"\Digit B:\n";
 B.Show();

 cout<<"\noperator+:\n";
 C=A+B;
 C.Show();

 cout<<"\noperator-:\n";
 C=A-B;
 C.Show();

 cout<<"\noperator*:\n";
 C=A*B;
 C.Show();
 
 cout<<"\noperator%:\n";
 C=A%B;
 C.Show();
}
Категория: C++ | Добавил: DEN-SHP (06.11.2012)
Просмотров: 1018 | Комментарии: 1 | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]