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


         

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


Любое из первых четырех множеств может оказаться пустым. Например, если среди членов класса SmallInt нет функции с именем operator+(), то четвертое множество будет пусто.

Все множество операторных функций-кандидатов является объединением пяти подмножеств, описанных выше:

namespace NS {

   class myFloat {

      myFloat( double );

   };

   class SmallInt {

      friend SmallInt operator+( const SmallInt &, int ) { /* ... */ }

   public:

      SmallInt( int );

      operator int();

      SmallInt operator+ ( const myFloat & );

      // ...

   };

   SmallInt operator+ ( const SmallInt &, double );

}

int main() {

   // тип si - class SmallInt:

   // Этот класс объявлен в пространстве имен NS

   NS::SmallInt si(15);

   int res = si + 5.66;  // какой operator+()?

   return 0;

}

В эти пять множеств входят семь операторных функций-кандидатов на роль operator+() в main():

  • первое множество пусто. В глобальной области видимости, а именно в ней употреблен operator+() в функции main(), нет объявлений перегруженного оператора operator+();
  • второе множество содержит операторы, объявленные в пространстве имен NS, где определен класс SmallInt. В этом пространстве имеется один оператор:
  • NS::SmallInt NS::operator+( const SmallInt &, double );

    • третье множество содержит операторы, объявленные друзьями класса SmallInt. Сюда входит
    • NS::SmallInt NS::operator+( const SmallInt &, int );

      • четвертое множество содержит операторы, объявленные членами SmallInt. Такой тоже есть:
      • NS::SmallInt NS::SmallInt::operator+( const myFloat & );

        • пятое множество содержит встроенные бинарные операторы:
        • int operator+( int, int );

          double operator+( double, double );

          T* operator+( T*, I );

          T* operator+( I, T* );

          Да, формирование множества кандидатов для разрешения оператора, использованного с применением операторного синтаксиса, утомительно. Но после того как оно построено, устоявшие функции и наилучшая из них находятся, как и прежде, путем анализа преобразований, применимых к операндам отобранных кандидатов.




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