«Қазақстан тарихы, жалпы білім беру пәндері және ақпараттық жүйелер» кафедрасы



бет25/64
Дата17.06.2022
өлшемі0.51 Mb.
#459285
түріЛекция
1   ...   21   22   23   24   25   26   27   28   ...   64
Конструктор не істейді? Ол объект экземплярында VMT кӛрсеткішінің ӛрісін инициализация жасайды; оған құрылып жатқан объект қай классқа тиісті болса сол класстың VMT жылжуын жазады.
Бұдан бӛлек, конструктор денесінде әдетте экземплярды инициализация жасау әрекеттерін орналастырады. VMT ӛрісі конструктор денесі инициализация жасалынбай тұрып, инициализация жасалынады.
Конструктор виртуал бола алмайды, себебі, жоғарыда айтылған виртуал тәсілдерді шақыру әдісі бойынша VMT-ны пайдалану(обращение к VMT)– бұл экземплярда тұрып VMT-ға сілтеме жасау дегені, ал дәл осы сілтемені конструктор инициализация жасайды.
Конструкторды шақыруға дейін VMT адресі экземпляр ӛрісіне жазылмаған болады, сондықтан, виртуал тәсілді шақыру қателікке алып келеді.
Мұраға алынған(inherited) конструктор қалай шақырылады?
Ол VMT ӛрісіне аталық-класс VMT-ң сілтемесін жазып қою керек еді ғой. Жауап мынадай:

  1. егер конструктор объект экземплярын кӛрсетумен(соның ішінде, басқа бір тәсілдің ішінде Self-ке қатысты немесе Self-ті кӛрсетпей-ақ) шақырылатын болса, онда ол объект экземплярының VMT ӛрісін инициализация жасағанда объект экземплярының адресі жазылған айнымалының қандай типте жарияланғандығын басшылыққа алады.

  2. Егер конструктор мұраға алынған сияқты шақырылатын болса(басқа бір тәсілдің ішінен inherited қызметші сӛзі не аталық-класс атауы кӛрсетіліп), онда ол VMT ӛрісінинициализация жасамайды, қарапайым инициализация тәсілі секілді жұмыс істейді(дәлірегі, ол логикалық мән қайтарады, бұл туралы кейінірек тоқталамыз).

Бірінші ережеден келіп шығатын салдар. Егер мұраға алынған және қайта анықталмаған конструктор ұрпақ экземплярына қатысты шақырылса, онда VMT ӛрісі әрекетті орындаушы-объектті білдіретін айнымалы типіне сәйкес инициализация жасалынады, яғни оған ұрпақ VMT-ң кӛрсеткіші коррект жазылатын болады.
VMT кӛрсеткішін инициализациялау кодын шақыру компилятор арқылы конструкторды шақыру кезінде қосымша ӛз-ӛзінен қойылады, яғни ол конструктор кодының бір бӛлігі боп табылмайды. Дәл осыған байланысты мұраға алынған конструктор (аталықтың экземплярына қатысты шақырылып тұрып) VMT кӛрсеткішін аталықтың экземплярында дұрыс инициализация жасайды.
Рекомендация. Программаның қауіпті болу мүмкін аймақтарын тудырмау үшін басқа тәсіл конструкторларын шақырмаған дұрыс. Алайда, берілген класста мұраға алынған және қайта анықталған конструкторды осы конструктордың жаңа реализациясынан шақыруға болады.
Ішкі класста қайтаанықталу кезінде мұраға алынған конструктор конструктордың жаңа реализациясы денесінде әдетте, ең басында шақырылады.


Достарыңызбен бөлісу:
1   ...   21   22   23   24   25   26   27   28   ...   64




©dereksiz.org 2024
әкімшілігінің қараңыз

    Басты бет