Объектга йўналтирилган программалаш
Download 0.58 Mb.
|
С ОЙП
- Bu sahifa navigatsiya:
- x=0; y=0; cout cout cout }
- // Қандайдир ишни бажариш Tizimni_tekshirish(); // Энди объектни инициализациялаш мумкин! Nuqta * krst=new(nuqta) Nuqta(10,20);
- include class Satr { union { char ch; char buf[81]; }; public
- char satr_buffer[sizeof(Satr)]; // хотира буфери int main() { // Сатрни буферга жойлаштириш Satr * krst=new(satr_buffer) Satr(“C++”);
- Satr sinfining satrli konstruktori satr_buffer=C++ Satr::Satr() Satr sinfining belgili konstruktori satr_buffer[0]=c
- Вақтли ва кечиктирилган боғланишлар. Динамик полиморфизм
}
class Nuqta { int x,y; public: Nuqta(int _x,int _y) { x=_x; y=_y; cout<<” Ob’ektlar berilgan qiymatlar bilan”; cout<<” initsializatsiyalandi.\n“; cout<<“ x=”< } Nuqta() { x=0; y=0; cout<<” Ob’ektlarni kelishuv bo’yicha”; cout<<” initsializatsiyalandi.\n“; cout<<“ x=”< } ~Nuqta() {cout<<”Nuqta::~Nuqta() ishladi\n”;} } // Глобал объект Nuqta nuqta; int main() { // Қандайдир ишни бажариш Tizimni_tekshirish(); // Энди объектни инициализациялаш мумкин! Nuqta * krst=new(nuqta) Nuqta(10,20); krst->Nuqta::~Nuqta(); return 0; } Программа натижаси қуйидаги хабарлар бўлади: Ob'ektlarni kelishuv bo'yicha initsializatsiyalandi. x=0 y=0 Tizim normal ishlaypti! Ob'ekt ko'rstatilgan adresga joylandi Ob'ektlar berilgan qiymatlar bilan initsializatsiyalandi. x=10 y=20 Nuqta::~Nuqta() ishladi Nuqta::~Nuqta() ishladi Кейинги программа new операторини қайта юклашни синф ичида жойлашувчи шаклидан фойдаланган ҳолда амалга оширишга мисол: #include class Satr { union { char ch; char buf[81]; }; public: Satr(char c=’\0’): ch(c) { cout<<”Satr sinfining belgili konstruktori\n”; } Satr(char * s) { cout<<”Satr sinfining satrli konstruktori\n”; strcpy(buf,s); } ~Satr(){cout<<”Satr::~Satr()”< // new операторининг жойлашувчи синтаксиси void* operator new(size_t, void * buffer) { return buffer; } }; char satr_buffer[sizeof(Satr)]; // хотира буфери int main() { // Сатрни буферга жойлаштириш Satr * krst=new(satr_buffer) Satr(“C++”); cout<<”satr_buffer”< // Деструкторни ошкор равишда чақириш krst->Satr::~Satr(); // ‘c’ белгисини satr бошига жойлаштириш krst=new(satr_buffer)Satr(‘c’); cout<<”satr_buffer[0]=”< cout<<”Буфернинг янги қиймати”< cout<<”satr_buffer=”< // Деструкторни ошкор равишда чақириш krst->Satr::~Satr(); return 0; } Программада глобал объект satr_buffer сатри яратилади ва шу хотира соҳасига Satr синфи объекти “C++” қиймати билан жойлаштирилади. Ошкор равишда синф деструктори чақириш оркали синф объекти йўқотилади. Кейин, худди шу адресда Satr синфининг иккинчи объектни ‘c’ белгиси билан яратилади, хотиранинг satr_buffer адресли соҳасида сатр қиймат чоп этилади ва синф объекти йўқотилади. Программа ишлаши натижасида экранда Satr sinfining satrli konstruktori satr_buffer=C++ Satr::~Satr() Satr sinfining belgili konstruktori satr_buffer[0]=c Bufferning yangi qiymati satr_buffer=c++ Satr::~Satr() хабарлар чоп этилади. ??????????????????????? 16-боб. Полиморфизм ва виртуал функциялар Вақтли ва кечиктирилган боғланишлар. Динамик полиморфизм С++ тилида полиморфизм икки усулда қўллаб-қувватланади. Биринчиси, функция ва операторларни қайта юклаш воситаси билан компиляция пайтида. Полиморфизмнинг бу кўринишига статик полиморфизм дейилади, чунки у программа бажарилишидан олдин, яъни компиляция ва компоновка пайтида функция идентификатор-ларини физик адреслар билан вақтли боғлаш орқали амалга ошири-лади. Иккинчисида, программа бажарилишида виртуал функциялар воситасида. Программа кодида виртуал функцияга мурожаатни учратган компилятор, бу чақиришни фақат белгилаб қўяди, функция идентификаторини адрес билан боғлашни программани бажариш босқичига қолдиради. Бу жараёнга кечиктирилган боғланиш дейилади. Виртуал функция – бу шундай функцияки, уни чақириш (ва мос амалларни бажариш), уни чақирган объект турига боғлиқ бўлади. Объект программа бажарилиш жараёнида қайси функцияни чақириш кераклигини аниқлайди. Полиморфизмнинг бу кўринишига динамик полиморфизм дейилади. Динамик полиморфизмни амалга оширишнинг асоси сифатида С++ тилидаги таянч синфга кўрсаткични аниқланишидир. Ўз навбатида, бу кўрсаткич нафақат таянч синфга, балки шу синфнинг вориси бўлган ихтиёрий синф объектига кўрсатиши мумкин. Синфларнинг бу хоссаси ворисликдан келиб чиқади, чунки ҳар қандай ворис синф объекти таянч синф турида бўлади.Программани йиғиш пайтида (компоновка пайтида) таянч синфга кўрсаткич эгаси бўлган фойдаланувчи томонидан қайси синф объекти яратилиши номаълум бўлади. Шу сабабли, кўрсаткич ўз объекти билан фақат программа ишлаши пайтидагини, яъни динамик равишда боғланиши мумкин. Таркибида ҳеч бўлмаганда битта виртуал функцияси бўлган синф полиморфм синф дейилади. Ҳар бир полиморф турдаги берилганлар учун компилятор виртуал функциялар жадвалини яратади ва шу жадвалга яширинган кўрсаткични синфнинг ҳар бир объектига жойлаштиради. Компилятор виртуал функциялар жадвалига кўрсаткични инициализация қилувчи код бўлагини полиморф синф конструктори бошланишига жойлаштиради. Виртуал функция чақирилганда ушбу код виртуал функциялар жадвалига кўрсаткични топади, кейин жадвалдан мос функция адресини олади. Кейин кўрсатилган адресга ўтиш билан функция чақириши рўй беради. Маълумки, ҳосилавий синф объекти яратилишида таянч синф конструктори чақирилади. Айни шу босқичда виртуал функциялар жадвали ва унга кўрсаткич ҳосил бўлади. Ҳосилавий синф конструктори чақирилгандан кейин виртуал функциялар жадвалига кўрсаткич, шу синф объекти учун қайта аниқланган виртуал функция вариантини кўрсатиш учун мосланади (агар у мавжуд бўлса). Кўриниб турибдики, кечиктирилган боғланишни амалга ошириш муайян бир ресурслар сарфлашни тақоза этади ва ундан оқилана фойдаланиш зарур бўлади. Download 0.58 Mb. Do'stlaringiz bilan baham: |
ma'muriyatiga murojaat qiling