С++ для начинающих


         

.Операторные функции-кандидаты - часть 2


namespace NS {

   class SmallInt {

      friend SmallInt operator+( const SmallInt&, int )

                               { /* ... */ }

   };

}

int main() {

   NS::SmallInt si(15);

   // функция-друг operator+() - кандидат

   int res = si + 566;

   return 0;

}

Операнд si имеет тип SmallInt. Операторная функция operator+(const SmallInt&, int), являющаяся другом этого класса, – член пространства имен NS, хотя непосредственно в этом пространстве она не объявлена. При обычном поиске в NS эта операторная функция не будет найдена. Однако при использовании operator+() с аргументом типа SmallInt функции-друзья, объявленные в области видимости этого класса, включаются в рассмотрение и добавляются к множеству кандидатов.

Эти три множества операторных функций-кандидатов формируются точно так же, как и для вызовов обычных функций с аргументами типа класса. Однако при использовании операторного синтаксиса строятся еще два множества:

  • множество операторов-членов, объявленных в классе левого операнда. Если такой операнд оператора operator+() имеет тип класса, то в множество функций-кандидатов включаются объявления operator+(), являющиеся членами этого класса:
  • class myFloat {

       myFloat( double );

    };

    class SmallInt {

    public:

       SmallInt( int );

       SmallInt operator+ ( const myFloat & );

    };

    int main() {

       SmallInt si(15);

       int res = si + 5.66;  // оператор-член operator+() - кандидат

    }

    Оператор-член SmallInt::operator+(const myFloat &), определенный в SmallInt, включается в множество функций-кандидатов для разрешения вызова operator+() в main();

    • множество встроенных операторов. Учитывая типы, которые можно использовать со встроенным operator+(), кандидатами являются также:
    • int operator+( int, int );

      double operator+( double, double );

      T* operator+( T*, I );

      T* operator+( I, T* );

      Первое объявление относится к встроенному оператору для сложения двух значений целых типов, второе – к оператору для сложения значений типов с плавающей точкой. Третье и четвертое соответствуют встроенному оператору сложения указательных типов, который используется для прибавления целого числа к указателю. Два последних объявления представлены в символическом виде и описывают целое семейство встроенных операторов, которые могут быть выбраны компилятором на роль кандидатов при обработке операций сложения.




      Содержание  Назад  Вперед