C++ за 21 день седьмое издание



Download 1,38 Mb.
bet222/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   218   219   220   221   222   223   224   225   ...   437
Bog'liq
word1

13


14


15


16


17


18

  1. }







if(Initiallnput != NULL)

{
Buffer = new char [strlen(Initiallnput) + 1]; strcpy(Buffer, Initiallnput);


}
else




Buffer = NULL;

  1. // вставить конструктор копий из листинга 9.9




  1. MyString(const MyString& CopySource);

23



  1. // Оператор присвоения копии




  1. MyString& operator= (const MyString& CopySource)




  1. {




  1. if ((this != &CopySource) && (CopySource.Buffer != NULL))




  1. {




  1. if (Buffer != NULL)

    30

    delete[] Buffer;

    31




  2. // гарантирует глубокую копию с предварительным




    1. резервированием собственного буфера




  1. Buffer = new char [strlen(CopySource.Buffer) + 1];








  1. // копирование оригинала в локальный буфер




  1. strcpy(Buffer, CopySource.Buffer);




  1. }




  1. return *this;




  1. }



40

324 ЗАНЯТИЕ 12. Типы операторов и их перегрузка



  1. I I Деструктор




  1. -MyString ()




  1. {




  1. if (Buffer != NULL)




  1. delete [] Buffer;




  1. }



47:



  1. int GetLengthO




  1. {




  1. return strlen(Buffer);




  1. }



52:



  1. operator const char*()




  1. {




  1. return Buffer;




  1. }




  1. };



58:



  1. int main ()




  1. {




  1. MyString Stringl("Hello ");




  1. MyString String2(" World");





  1. 64:

    cout

    «

    "Before assignment:

    " « endl;

    65:

    cout

    «

    Stringl « String2

    « endl;

  2. String2 = Stringl;




  1. cout « "After assignment String2 = Stringl: " « endl;

    68:

    cout «

    Stringl « String2 « endl;

    69:







  2. return 0;




  1. }



Результат


Before assignment:


Hello World


After assignment String2 = Stringl:


Hello Hello


Анализ



  1. преднамеренно пропустил конструктор копий в этом примере, чтобы сократить объем кода (но при создании подобного класса обязательно добавьте его; см. листинг 9.9). Оператор присвоения копии реализован в строках 25-39. Это очень похоже на конструк­ тор копий, но с предварительной проверкой, гарантирующей, что оригинал и копия не являются тем же объектом. После успеш ной проверки оператор присвоения копии для класса M y S trin g освобождает сначала свой внутренний буфер, затем повторно резерви­ рует место для текста копии, а потом использует функцию s t r c p y () для копирования, как показано в строке 36.

Бинарные операторы 325


ПРИМЕЧАНИЕ Еще одно незначительное различие между листингами 12.9 и 9.9 в том, что

функция Getstring () заменена оператором const char*, как демонстри­


руют строки 53-56. Этот оператор облегчает использование класса MyString, как показано в строке 68, где один оператор cout используется для отображе­ ния двух экземпляров класса MyString.



ВНИМАНИЕ!


СОВЕТ
При реализации класса, который управляет динамически распределяемым ре­ сурсом, таким как символьная строка в стиле С, динамический массив и т.д., всегда следует реализовать (или рассмотреть необходимость реализовать) кон­ структор копий и оператор присвоения копии в дополнение к конструктору и деструктору.

Если вы не решаете проблему собственности ресурса явно, когда объект ваше­ го класса копируется, ваш класс неполон и даже опасен для использования.


Чтобы создать класс, который не может быть скопирован, объявите конструктор копий и оператор присвоения копии как закрытый. Объявления (даже не реа­ лизации) вполне достаточно для компилятора, чтобы передать сообщение об ошибке при любых попытках копирования этого класса при передаче в функцию по значению или при присвоении одного экземпляра другому.

Оператор индексирования([])

Оператор [ ], позволяющий обращаться к классу в стиле массива, называется операто­ ром индексирования (subscript operator). Типичный синтаксис оператора индексирования таков:




т ип_возвращ аемого_значенияЬ operator [] (тип_индекса& индекс);

Так, при создании такого класса, как M y S trin g , инкапсулирующего класс динамиче­ ского массива символов c h a r* B u f f e r , оператор индексирования существенно облегчит произвольный доступ к отдельным символам в буфере:




class MyString

{


  1. ... другие члены класса



public:


/*const*/ char& operator [] (int Index) /*const*/
{
// возвратить из буфера символ по позиции индекса

}
};


Пример в листинге 12.10 демонстрирует, как оператор индексирования ([ ]) позволяет пользователю перебирать символы, содержавшиеся в экземпляре класса M y S trin g , с ис­ пользованием обычной семантики массива.



326 ЗАНЯТИЕ 12. Типы операторов и их перегрузка

ЛИСТИНГ 12.10. Реализация оператора индексирования ([ ]) в классе Mystring, обеспечивающего произвольный доступ к символам в буфере MyString::Buffer





  1. #include




  1. #include




  1. using namespace std;








  1. class MyString




  1. {




  1. private:




  1. char* Buffer;

  2. :




    1. // закрытый стандартный конструктор




    1. MyString() {}

1 1 :



  1. public:




  1. // Конструктор




  1. MyString(const char*Initiallnput)




  1. {




  1. if(Initiallnput != NULL)




  1. {




  1. Buffer = new char [strlen (Initiallnput) + lb-




  1. strcpy(Buffer, Initiallnput);



20: }



  1. else




  1. Buffer = NULL;




  1. }



24:



  1. // Конструктор копий: вставить из листинга 9.9




  1. MyString(const MyString& CopySource);



27:



  1. // Оператор присвоения копии: вставить из листинга 12.9




  1. MyString& operator= (const MyString& CopySource);



30:



  1. const char& operator[] (int Index) const




  1. {




  1. if (Index < GetLengthO)




  1. return Buffer[Index];




  1. }



36:



  1. // Деструктор




  1. ~MyString()




  1. {




  1. if (Buffer != NULL)




  1. delete [] Buffer;




  1. }



43:



  1. int GetLengthO const




  1. {




  1. return strlen(Buffer);




  1. }



48:



  1. operator const char*()




  1. {



51 return Buffer;

Бинарные операторы

327

}


:5: int main()

:6: {
cout « "Type a statement: ";





  1. string strlnput;



:9: getline(cin, strlnput);



cl:

MyString

youSaid(strlnput.c_str());










t2:

cout

«




"Using

operator[]




for displaying your input:

" «

endl;

-3:




<

t'4:

for(int

Index

= 0;

Index

youSaid. GetLength () ; ++Index)




-5:

cout




cout

«

youSaid [Index]

«

" ";










~6:




«

endl;

























i l :

cout

«




"Enter

index 0 -

" «


Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   218   219   220   221   222   223   224   225   ...   437




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©hozir.org 2024
ma'muriyatiga murojaat qiling

kiriting | ro'yxatdan o'tish
    Bosh sahifa
юртда тантана
Боғда битган
Бугун юртда
Эшитганлар жилманглар
Эшитмадим деманглар
битган бодомлар
Yangiariq tumani
qitish marakazi
Raqamli texnologiyalar
ilishida muhokamadan
tasdiqqa tavsiya
tavsiya etilgan
iqtisodiyot kafedrasi
steiermarkischen landesregierung
asarlaringizni yuboring
o'zingizning asarlaringizni
Iltimos faqat
faqat o'zingizning
steierm rkischen
landesregierung fachabteilung
rkischen landesregierung
hamshira loyihasi
loyihasi mavsum
faolyatining oqibatlari
asosiy adabiyotlar
fakulteti ahborot
ahborot havfsizligi
havfsizligi kafedrasi
fanidan bo’yicha
fakulteti iqtisodiyot
boshqaruv fakulteti
chiqarishda boshqaruv
ishlab chiqarishda
iqtisodiyot fakultet
multiservis tarmoqlari
fanidan asosiy
Uzbek fanidan
mavzulari potok
asosidagi multiservis
'aliyyil a'ziym
billahil 'aliyyil
illaa billahil
quvvata illaa
falah' deganida
Kompyuter savodxonligi
bo’yicha mustaqil
'alal falah'
Hayya 'alal
'alas soloh
Hayya 'alas
mavsum boyicha


yuklab olish