определять перегруженные операторы, не являющиеся
Разрешается, однако, определять перегруженные операторы, не являющиеся членами класса. При анализе строки в main(), вызвавшей ошибку компиляции, подобные операторы принимались во внимание. Таким образом, сравнение, в котором C-строка стоит в левой части, можно сделать корректным, если заменить операторы равенства, являющиеся членами класса String, на операторы равенства, объявленные в области видимости пространства имен:
bool operator==( const String &, const String & );
bool operator==( const String &, const char * );
Обратите внимание, что эти глобальные перегруженные операторы имеют на один параметр больше, чем операторы-члены. Если оператор является членом класса, то первым параметром неявно передается указатель this. То есть для операторов-членов выражение
flower == "lily"
переписывается компилятором в виде:
flower.operator==( "lily" )
и на левый операнд flower в определении перегруженного оператора-члена можно сослаться с помощью this. (Указатель this введен в разделе 13.4.) В случае глобального перегруженного оператора параметр, представляющий левый операнд, должен быть задан явно.
Тогда выражение
flower == "lily"
вызывает оператор
bool operator==( const String &, const char * );
Непонятно, какой оператор вызывается для второго случая использования оператора равенства:
"tulip" == flower
Мы ведь не определили такой перегруженный оператор:
bool operator==( const char *, const String & );
Но это необязательно. Когда перегруженный оператор является функцией в пространстве имен, то как для первого, так и для второго его параметра (для левого и правого операндов) рассматриваются возможные преобразования, т.е. компилятор интерпретирует второе использование оператора равенства как
operator==( String("tulip"), flower );
и вызывает для выполнения сравнения следующий перегруженный оператор:
bool operator==( const String &, const String & );
Но тогда зачем мы предоставили второй перегруженный оператор:
Содержание Назад Вперед
Forekc.ru
Рефераты, дипломы, курсовые, выпускные и квалификационные работы, диссертации, учебники, учебные пособия, лекции, методические пособия и рекомендации, программы и курсы обучения, публикации из профильных изданий