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



Download 1,38 Mb.
bet226/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   222   223   224   225   226   227   228   229   ...   437
Bog'liq
word1

#include




  1. using namespace std;

2 :



  1. class MyString




  1. {




  1. private:




  1. char* Buffer;








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




  1. MyString(): Buffer(NULL)

    1 0 :

    {

    11:

    cout « "Default constructor called" « endl;

    1 2 :

    }

    13:




  2. public:




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




  1. ~MyString()

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




17:



  1. if (Buffer != NULL)




  1. delete [] Buffer;

    2 0 :

    }

    2 1 :

    int GetLengthO

    2 2 :

  2. {




  1. return strlen(Buffer);



25:}







  1. operator const char*()




  1. {




  1. return Buffer;



30:


31:



  1. MyString operator* (const MyStringS AddThis)




  1. {




  1. cout « ’’operator* called: " « endl;




  1. MyString NewString;

    36:

    if (AddThis.Buffer

    NULL)

    37:

  2. {




  1. NewString.Buffer = new char[GetLength() \




      1. strlen(AddThis.Buffer) + 1];




    1. strcpy(NewString.Buffer, Buffer);




    1. strcat(NewString.Buffer, AddThis.Buffer);












    1. return NewString;




    1. }



46:



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




  1. MyString(const char* Initiallnput)




  1. {




  1. cout « "Constructor called for: " « Initiallnput « endl;




  1. if(Initiallnput != NULL)




  1. {




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




  1. strcpy(Buffer, Initiallnput);




  1. }




  1. else




  1. Buffer = NULL;




  1. }



59:



  1. // конструктор копий




  1. MyString(const MyString& CopySource)




  1. {




  1. cout«"Copy constructor to copy from: " « CopySource.Buffer




    1. endl;




  1. if(CopySource.Buffer != NULL)




  1. {

66:

//

гарантировать

глубокое копирование, зарезервировав




//

предварительно

собственный буфер

6 7 :

Buffer = new char

[strlen(CopySource.Buffer) + 1];

6 8:



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




  1. strcpy(Buffer, CopySource.Buffer);



71:



  1. else




  1. Buffer = NULL;




  1. }



75:



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




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




  1. {




  1. cout«"Copy assignment operator to copy from: " « CopySource.Buffer « endl;

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




  1. {




  1. if (Buffer != NULL)

    83:

    delete[] Buffer;

    84:




  2. // гарантировать глубокое копирование, зарезервировав



// предварительно собственный буфер


86: Buffer = new char [strlen(CopySource.Buffer) + 1];
87:
8 8 : // копировать из оригинала в локальный буфер



  1. strcpy(Buffer, CopySource.Buffer);












  1. return *this;




  1. }



94:



  1. // Конструктор перемещения




  1. MyString(MyString&& MoveSource)




  1. {




  1. cout « "Move constructor to move from: "




    1. MoveSource.Buffer « endl;




  1. if(MoveSource.Buffer != NULL)

    100:

    {

    // взять собственность

    101:

    Buffer = MoveSource.Buffer;




    MoveSource.Buffer = NULL;

    // т .e . 'переместить'

    102:

    //

    освободить источник







    //

    перемещения

  2. }




  1. }



105:



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




  1. MyStringS operator= (MyString&& MoveSource)




  1. {




  1. cout«"Move assignment operator to move from: "




    1. MoveSource.Buffer « endl;

      110:

      if((MoveSource.Buffer != NULL) &&

      (this != &MoveSource))

      111:

      {

      собственный буфер

      112:

      delete Buffer; // освободить

      113:







  1. Buffer = MoveSource.Buffer; // взять собственность




    1. т .e . 'переместить'

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




    1. MoveSource.Buffer = NULL; // освободить источник




      1. перемещения



116


117



  1. return *this;





  1. 20: };

121
122 int main ()


123: {



  1. MyString Hello("Hello ");




  1. MyString World("World");




  1. MyString CPP(" of C++");








  1. MyString sayHelloAgain ("overwrite this");




  1. sayHelloAgain = Hello + World + CPP;





131

return 0;

132:

}



Результат

Вывод без конструктора перемещ ения и оператора присваивания при перемещении (при закомментированных строках 95-119):


Constructor called for: Hello


Constructor called for: World


Constructor called for: of C++


Constructor called for: overwrite this


operator+ called:


Default constructor called


Copy constructor to copy from: Hello World operator+ called:
Default constructor called


Copy constructor to copy from: Hello World of C++


Copy assignment operator to copy from: Hello World of C++

Вывод с конструктором перемещения и оператором присваивания при перемещении:




Constructor called for: Hello


Constructor called for: World


Constructor called for: of C++


Constructor called for: overwrite this


operator+ called:


Default constructor called


Move constructor to move from: Hello World operator+ called:
Default constructor called


Move constructor to move from: Hello World of C++


Move assignment operator to move from: Hello World of C++

Операторы, которые не могут быть перегружены

335



Анализ

Пример кода получился действительно длинным, но большая его часть уже была пред­ ставлена в предыдущих примерах и занятиях. Самая важная часть этого листинга находит­ ся в строках 95-119, где реализованы конструктор перемещения и оператор присваивания при перемещении соответственно. Те части вывода, на которые воздействуют нововведе­ ния стандарта С++11, выделены полужирным шрифтом. Обратите внимание, насколько существенно изменился вывод по сравнению с тем же классом, но без этих двух средств. Если рассмотреть реализацию конструктора перемещения и оператора присваивания при перемещении, то можно заметить, что семантика перемещения по существу реализуется за счет принятия принадлежности ресурсов от источника перемещения (строка 101 в кон­ структоре перемещения и строка 114 в операторе присваивания при перемещении). Непо­ средственно за этим следует присвоение значения NULL указателю источника (строки 102





  1. 115). Таким образом, даже когда источник перемещения удаляется, вызываемый через деструктор в оператор d e l e t e (строки 16-20) по существу ничего не делает, поскольку собственность была передана объекту получателя. Обратите внимание, что в отсутствии конструктора перемещения вызывается конструктор копий, который осуществляет глубо­ кое копирование строки. Таким образом, конструктор перемещения существенно эконо­ мит на продолжительности обработки и сокращает количество нежелательных операций резервирования памяти и этапов копирования.

Создание конструктора перемещения и оператора присваивания при перемещении со­ вершенно необязательно. В отличие от конструктора копий и оператора присвоения копии, компилятор не добавляет его стандартную реализацию сам.


Используйте эти средства С++11 для оптимизации работы классов, которые указывают на динамически распределяемые ресурсы, которые в противном случае требовали бы глу­ бокого копирования даже в тех случаях, где они требуются только временно.





Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   222   223   224   225   226   227   228   229   ...   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