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

1 ... 41 42 43 [ 44 ] 45 46 47 ... 395


ptr->size();

this всегда указывает на объект класса, через который происходит вызов функции. Если

obj[ 1024 ] ;

то внутри size() значением this будет адрес, хранящийся в ptr. Внутри операции взятия индекса this содержит адрес obj. Разыменовывая this (использованием *this),

inline Strings

String::operator=( const char *s ) {

if ( ! s ) {

size = 0; delete [] string; string = 0;

else {

size = str1en( s );

г 1

delete [] string;

string = new char[ size + 1 ]; strcpy( string, s );

мы получаем сам объект. (Указатель this детально описан в разделе 13.4.)

return *this;

При реализации операции присваивания довольно часто допускают одну ошибку: забывают проверить, не является ли копируемый объект тем же самым, в который происходит копирование. Mi выполним эту проверку, используя все тот же указатель

inline Strings

String::operator=( const String srhs ) {

в важении

namel = *pointer to string this представляет собой name1, rhs - *pointer to string.

this:

if ( this != &rhs ) {

Вот полный текст операции присваивания объекту String объекта того же типа:

this является указателем, адресующим объект name1 внутри тела функции операции присваивания.



inline Strings

String::operator=( const String srhs ) {

if ( this != srhs ) { delete [] string;

size = rhs. size;

if ( ! rhs. string ) string = 0;

else {

string = new char[ size + 1 ]; strcpy( string, rhs. string );

return *this;

Операция взятия индекса практически совпадает с ее реализацией для массива Array,

#include <cassert> inline chars

String::operator[] ( int elem ) {

assert( elem >= 0 ss elem < size ); return string[ elem ];

который м1 создали в разделе 2.3:

Операторы ввода и вывода реализуются как отдельные функции, а не члены класса. (О причинах этого м1 поговорим в разделе 15.2. В разделах 20.4 и 20.5 рассказывается о перегрузке операторов ввода и вывода библиотеки iostream.) Наш оператор ввода может прочесть не более 4095 символов. setw() - предопределенный манипулятор, он читает из входного потока заданное число символов минус 1, гарантируя тем самым, что мы не переполним наш внутренний буфер inBuf. (В главе 20 манипулятор setw() рассматривается детально.) Для использования манипуляторов нужно включить

#include <iomanip> inline istreams

operator>>( istream sio, String ss ) {

искусственное ограничение: 4096 символов const int 1imit string size = 4096; char inBuf[ limit string size ]; setw() входит в библиотеку iostream

он ограничивает размер читаемого блока до 1imit string size-l io >> setw( 1imit string size ) >> inBuf; s = mBuf; String::operator=( const char* ); return io;

соответствующий заголовочный файл:



inline ostreams

operator<<( ostreams os, const String ss ) {

return os << s.c str();

реализации операции вывода:

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

Оператору вывода необходим доступ к внутреннему представлению строки String. Так как operator<< не является функцией-членом, он не имеет доступа к закрытому члену данных string. Ситуацию можно разрешить двумя способами: объявить operator<< дружественным классу String, используя ключевое слово friend (дружественные отношения рассматриваются в разделе 15.2), или реализовать встраиваемую (inline) функцию для доступа к этому члену. В нашем случае уже есть такая функция: c str() обеспечивает доступ к внутреннему представлению строки. Воспользуемся ею при



1 ... 41 42 43 [ 44 ] 45 46 47 ... 395

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