Язык программирования C++. Вводный курс




.Неоднозначность


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

class String {

   // ...

public:

   String( const char * = 0 );

   bool operator== ( const String & ) const;

   // нет оператора operator== ( const char * )

};

и такое использование оператора operator==:

String flower( "tulip" );

void foo( const char *pf ) {

   // вызывается перегруженный оператор String::operator==()

   if ( flower == pf )

      cout << pf << " is a flower!\en";

      // ...

}

Тогда при сравнении

flower == pf

вызывается оператор равенства класса String:

String::operator==( const String & ) const;

Для трансформации правого операнда pf из типа const char* в тип String

параметра operator==()

применяется определенное пользователем преобразование, которое вызывает конструктор:

String( const char * )

Если добавить в определение класса String

конвертер в тип const char*:

class String {

   // ...

public:

   String( const char * = 0 );

   bool operator== ( const String & ) const;

   operator const char*();  // новый конвертер

};

то показанное использование operator==()

становится неоднозначным:

// проверка на равенство больше не компилируется!

if (flower == pf)

Из-за добавления конвертера operator const

char*()

встроенный оператор сравнения

bool operator==( const char *, const char * )

тоже считается устоявшей функцией. С его помощью левый операнд flower

типа String

может быть преобразован в тип const char *.

Теперь для использования operator==() в foo()

есть две устоявших операторных функции. Первая из них

String::operator==( const String & ) const;

требует применения определенного пользователем преобразования правого операнда pf из типа const char* в тип String. Вторая

bool operator==( const char *, const char * )




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