|
Программирование >> Инициализация объектов класса, структура
if ( name[0] != S ) массивы объектов встроенного типа: cout << увы, что-то не так\n ; (Детально этот оператор описывается в разделе 15.4.) В третьем наборе определены перегруженные операторы равенства для объектов класса String. Программа может проверить равенство двух таких объектов или объекта и C- str1 == str2; bool operator==( const char * ) ; набор перегруженных операторов равенства strl - str2- строки: bool operator==( const String s ); Перегруженные операторы позволяют использовать объекты типа класса с операторами, определенными в главе 4, и манипулировать ими так же интуитивно, как объектами встроенных типов. Например, желая определить операцию конкатенации двух объектов класса String, мы могли бы реализовать ее в виде функции-члена concat() . Но почему concat() , а не, скажем, append() ? Выбранное нами имя логично и легко запоминается, но пользователь все же может забыть, как мы назвали функцию. Зачастую имя проще запомнить, если определить перегруженный оператор. К примеру, вместо concat() мы назвали бы новую операцию operator+= (). Такой оператор используется следующим #include String.h int main() { String name1 Sherlock ; String name2 Holmes ; name1 += ; name1 += name2; if (! ( name1 == Sherlock Holmes ) ) cout << конкатенация не сработала\n ; образом: Перегруженный оператор объявляется в теле класса точно так же, как обычная функция-член, только его имя состоит из ключевого слова operator, за которым следует один из множества предопределенных в языке C++ операторов (см. табл. 15.1). Так можно объявить operator+=() в классе String: перегруженный оператор взятия индекса chars operator[]( int ); Он позволяет программе индексировать объекты класса String точно так же, как class String { public: набор перегруженн операторов + Strings operator+=( const String s Strings operator+=( const char * ); ... private: ... #include <cstring> inline Strings String::operator+=( const String srhs ) { Если строка, на котор сс1лается rhs, непуста if ( rhs. string ) String tmp( *this ); выделить область памяти, достаточную для хранения конкатенированн строк size += rhs. size; delete [] string; string = new char[ size + 1 ]; сначала скопировать в выделенную область исходную строку затем дописать в конец строку, на которую ссылается rhs strcpy( string, tmp. string ); strcpy( string + tmp. size, rhs. st string ); return *this; inline Strings String::operator+=( const char *s ) { Если указатель s ненулевой if ( s ) { String tmp( *this ); выделить область памяти, достаточную для хранения конкатенированных строк size += strlen( s ); delete [] string; string = new char[ size + 1 ]; сначала скопировать в выделенную область исходную строку затем дописать в конец C-строку, на котор сс1лается s strcpy( string, tmp. string ); strcpy( string + tmp. size, s ); return *this; определить его следующим образом: #include String.h int main() { String flower; что-нибудь записать в переменно flower if ( flower == lily ) правильно ... else if ( tulip == flower ) ошибка ... строки: При первом использовании оператора равенства в main() вызывается перегруженный operator==(const char *) класса String. Однако на второй инструкции if компилятор выдает сообщение об ошибке. В чем дело? Перегруженный оператор, являющийся членом некоторого класса, применяется только тогда, когда левгм операндом служит объект этого класса. Поскольку во втором случае левый операнд не принадлежит к классу String, компилятор пытается найти такой встроенный оператор, для которого левым операндом может быть С-строка, а правым -объект класса String. Разумеется, его не существует, поэтому компилятор говорит об ошибке. Но можно же создать объект класса String из С-строки с помощью конструктора класса. Почему компилятор не выполнит неявно такое преобразование: if ( String( tulip ) == flower ) правильно: вызается оператор-член Причина в его неэффективности. Перегруженные операторы не требуют, чтобы оба операнда имели один и тот же тип. К примеру, в классе Text определяются следующие class Text { public: Text( const char * = 0 ); Text( const Text s ); набор перегруженных операторов равенства bool operator==( const char * ) const; bool operator==( const String s ) const; bool operator==( const Text s ) const; ... операторы равенства: и выражение в main() можно переписать так: 15.1.1. Члены и не члены класса Рассмотрим операторы равенства в нашем классе String более внимательно. Первый оператор позволяет устанавливать равенство двух объектов, а второй - объекта и C-
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |