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



Download 1,38 Mb.
bet400/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   396   397   398   399   400   401   402   403   ...   437
Bog'liq
word1

О: template



    1. class destructivecopy_pointer

2 : {

  1. private:




  1. T* pObject;

Типы интеллектуальных указателей

581




  1. public:




  1. destructivecopy_pointer(Т* plnput):pObject(plnput) {}

  2. ~destructivecopy_pointer() { delete pObject; }

8
9 // конструктор копий



  1. destructivecopy_pointer(destructivecopy_pointer& source)




  1. {

  2. // Взять копию в собственность




  1. pObject = source.pObject;



14



  1. // удалить первоисточник




  1. source.pObject = 0;




  1. }



18



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




  1. destructivecopy_pointer& operator= (destructivecopy_pointer& rhs)

  2. {




  1. if (pObject != source.pObject)




  1. {




  1. delete pObject;




  1. pObject = source.pObject;




  1. source.pObject = 0;



27


28


29


30



  1. int main()




  1. {




  1. destructivecopy_pointer pNumber (new int);




  1. destructivecopy_pointer pCopy = pNumber;








  1. // pNumber теперь недопустим




  1. return 0;




  1. }



Анализ



  1. листинге 26.3 показана самая важная часть реализации интеллектуального указа­ теля деструктивного копирования. Строки 10-17 и 20-28 содержат конструктор копий и оператор присвоения копии соответственно. Эти функции делают первоисточник недей­ ствительным при его копировании; т.е. после копирования конструктор копий устанавли­ вает указатель, содержавшийся первоисточником, в NULL, оправдывая название деструк­ тивное копирование. Оператор присвоения делает то же самое. Таким образом, указатель pNumber фактически объявляется недопустимым в строке 34, когда присваивается друго­ му указателю. Это поведение противоестественно действию присвоения.




ВНИМАНИЕ!
Конструктор копий и оператор присвоения копии, которые критически важны для реализации интеллектуальных указателей деструктивного копирования, также продемонстрированные в листинге 26.3, вызывают максимум критики. В отличие от большинства классов C++, у этого не может быть конструктора ко­ пий и оператора присвоения получающих константные ссылки, поскольку они

582 ЗАНЯТИЕ 26. Понятие интеллектуальных указателей
должны объявлять первоисточник недопустимым после его копирования. Это не только отклонение от традиционной семантики конструктора копий и оператора присвоения, это делает использование класса интеллектуального указателя не интуитивно понятным. Немногие ожидают, что оригинал копии или первоисточ­ ник присвоения окажутся недопустимы после присвоения или копирования. Тот факт, что такие интеллектуальные указатели уничтожают первоисточник, также делает их неподходящими для использования в таких контейнерах библиоте­ ки STL, как s t d : : v e c to r, или любой другой динамический класс коллекции, который вы могли бы использовать. Эти контейнеры должны копировать свое содержимое внутренне, а все заканчивается тем, что указатели оказываются недопустимыми.

По совокупности этих причин многие разработчики боятся интеллектуальных указателей деструктивного копирования как чумы.



СОВЕТ

До сих пор

по стандарту

C++ основным интеллектуальным указателем де­




структивного

копирования

считался указатель au to _ p tr. Теперь, в C++11,




его применение не рекомендуется, и вместо него следует использовать класс




s td : :u n iq u e _ p tr.





Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   396   397   398   399   400   401   402   403   ...   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