Программирование >>  Инициализация объектов класса, структура 

1 ... 233 234 235 [ 236 ] 237 238 239 ... 395


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-



1 ... 233 234 235 [ 236 ] 237 238 239 ... 395

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика