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



Download 1,38 Mb.
bet216/437
Sana22.02.2022
Hajmi1,38 Mb.
#89455
TuriРеферат
1   ...   212   213   214   215   216   217   218   219   ...   437
Bog'liq
word1

#include




  1. #include // включите это, чтобы использовать std::unique_ptr




  1. using namespace std;



3:



  1. class Date




  1. {




    1. private:




    1. int Day;




    1. int Month;




    1. int Year;





    1. string DatelnString;



1 2 :

    1. public:




    1. // Конструктор, инициализирующий объект днем, месяцем и годом




    1. Date (int InputDay, int InputMonth, int InputYear)




    1. : Day (InputDay), Mopt.h (InputMonth), Year (InputYear) {};








    1. void DisplayDate()




    1. {

      2 0

      :

      cout « Day « " / " « Month « " / " « Year « endl;

      2 1 :

      }

      2 2 :

      };

      23:




  1. int main()




  1. {




  1. unique_ptr pDynamicAllocInteger(new int);




  1. *pDynamicAllocInteger = 42;



28:



  1. // Использование интеллектуального указателя как типа int*




  1. cout « "Integer value is: " « *pDynamicAllocInteger « endl;








  1. unique_ptr pHoliday (new Date(25, 11, 2011));




  1. cout « "The new instance of date contains: ";



34:



  1. // Использование pHoliday точно как Date*




  1. pHoliday->DisplayDate();



37:



  1. // При использовании unique_ptr вследующем нет необходимости:




  1. // delete pDynamicAllocInteger;




  1. // delete pHoliday;



41:



  1. return 0;




  1. }

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




Результат


Integer value is: 42


The new instance of date contains: 25 / 11 / 2011


Анализ



  1. строке 26 объявляется интеллектуальный указатель типа i n t . Эта строка демонстри­ рует синтаксис инициализации шаблона для класса интеллектуального указателя u n iq u e _ p t r . Точно так же в строке 32 объявляется интеллектуальный указатель на экземпляр клас­ са D ate . Пока сосредоточьтесь на шаблоне и игнорируйте детали.



ПРИМЕЧАНИЕ

Не волнуйтесь, если синтаксис шаблона кажется пока непонятным, поскольку



шаблоны рассматриваются позже, на занятии 14, "Макросы и шаблоны”.



Этот пример демонстрирует не только то, как интеллектуальный указатель позволяет использовать обычный синтаксис указателя (строки 30 и 36). В строке 30 вы в состоянии отобразить значение типа i n t , используя синтаксис * p D y n a m ic A llo c In te g e r, тогда как в строке 36 вы используете вызов p H o lid a y - > D is p la y D a ta (), как будто этими двумя переменными были i n t * и D ate* соответственно. Секрет — в классе интеллектуального указателя s t d : :u n iq u e _ p tr , реализующего операторы (*) и (->). Листинг 12.4 является реализацией простого класса интеллектуального указателя.


ЛИСТИНГ 12.4. Реализация операторов (*) и (->) в простом классе интеллектуального указателя_______________





  1. #include




  1. using namespace std;



2 :

  1. template ctypename T>




  1. class smart_pointer




  1. {




  1. private:




  1. T* m_pRawPointer;




  1. public:




  1. smart_pointer (T* pData) : m_pRawPointer (pData) {}




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



10: ~smart_pointer () {delete m_pRawPointer ;} // Деструктор
1 1 :



  1. T& operator* () const // оператор обращения к значению




  1. {




  1. return * (m_pRawPointer);




  1. }



16:



  1. T* operator-> () const // оператор обращения к члену класса




  1. {




  1. return m_pRawPointer;

20: }
21: };


22



  1. class Date





Унарные операторы

311




  1. private:




  1. int Day, Month, Year;



1":string DatelnString;



  1. public:




  1. // Конструктор, инициализирующий объект днем, месяцем и годом




  1. Date (int InputDay, int InputMonth, int InputYear)




  1. : Day (InputDay), Month (InputMonth), Year (InputYear) {};




  1. void DisplayDate()




  1. {






26:


cout << Day «


"/"«


Month << " / " << Year << endl;



2 ":


}



43: int main()



  1. smart_pointer pDynamicInt(new int (42));




  1. cout « "Dynamically allocated integer value = " « *pDynamicInt;





  1. 5smart_pointer pDate(new Date(25, 12, 2011));




  1. cout « "Date is = ";

  2. pDate->DisplayDate();





  1. return 0;







Результат


Dynamically allocated integer value = 42


Date is = 25 / 12 / 2011


Анализ

Это версия листинга 12.3, в которой использован собственный класс s m a r t _ p o in te r , определенный в строках 3-24. Поскольку используется синтаксис объявления шаблона, интеллектуальный указатель можно настроить так, чтобы он указывал на любой тип, будь то i n t , как показано в строке 45, или D ate, как показано в строке 48. Наш класс интеллек­ туального указателя содержит закрытый член типа, на который он указывает, объявленный на строке 7. По существу, класс интеллектуального указателя стремится автоматизировать управление ресурсом, на который указывает этот член класса, включая его автоматическое освобождение в деструкторе, как показано в строке 10. Этот деструктор гарантирует, что, даже после вызова оператора new, вы не обязаны вызывать оператор d e l e t e для освобож ­ дения ресурса памяти вручную, и это не приводит к утечке памяти. Сосредоточьтесь на реализации оператора * в строках 12-15, который возвращает тип Т& (т.е. ссылку на тип, для которого этот шаблон специализируется). Реализация возвращает ссылку на экземпляр (строка 14). Аналогично оператор -> , как показано в строках 17-20, возвращает тип Т* (т.е. указатель типа, для которого этот шаблон специализируется). Реализация оператора





  1. > в строке 19 возвращает указатель на член класса. Вместе эти два оператора гарантиру­ ют, что класс s m a r t _ p o in te r абстрагирует управление памятью простого указателя и по­ зволяет использовать функциональные возможности обычного указателя, делая его таким образом интеллектуальным указателем.

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



ПРИМЕЧАНИЕ
Классы интеллектуального указателя способны на много большее, чем имита­ ция обычных указателей или освобождение памяти, когда они выходят из об­

ласти видимости. Более подробная информация по этой теме приведена на за­ нятии 26, “Понятие интеллектуальных указателей”.


Если применение указателя unique_ptr в листинге 12.3 заинтересовало вас, то, чтобы понять его внутреннее устройство, найдите его реализацию в файле заголовка , предоставляемом вашим компилятором или интегриро­ ванной средой разработки.



Download 1,38 Mb.

Do'stlaringiz bilan baham:
1   ...   212   213   214   215   216   217   218   219   ...   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