Энергетика


Дәріс №4. Кластар достары. Кластарға арналған стандартты



Pdf көрінісі
бет9/23
Дата07.02.2022
өлшемі1,03 Mb.
#91462
түріПрограмма
1   ...   5   6   7   8   9   10   11   12   ...   23
Байланысты:
is 1
ОП Энергетика каз, ОП Энергетика каз, портфолио, 15.02.19, 15.02.19, 111, 6575b84a-6758-11e5-9d50-f6d299da70eeУМКД Гигиена преп каз, 16 5, 6. leksia, 6. leksia, Мақала образец, қаз т оқу бағд дұрысы, озгерис сырттай Акпар Стан послед темы дипломных работ 2019 - 2020 - копия, БББ каз МФ 1 06.02 (2), БББ каз МФ 1 06.02 (2)
4 Дәріс №4. Кластар достары. Кластарға арналған стандартты 
операцияларды қайта жүктеу 
 
Дәрістің мақсаты:
класс достары және достық функциясы ұғымдарын
беру. 
 Дәрістің мазмұны:
достық функциясының ерекшеліктері. Көшіріп алу
конструкторы. Беттік және тереңдетілген көшіріп алу. Кластарға арналған 
операциялардың қайта жүктелуі. 
Класс мүшесі болмауына қарамастан кейбір жағдайларда функция 
кластың жабық мүшелеріне тиесілікке (доступ) ие болғаны жөн. Егер функция 
класс досы немесе мүшесі болып табылатын класты friend қызметші сөзі 
көмегімен жарияласа, осы әрекетті С++ ортасы орындауға мүмкіндік береді,. 
Достық функциялары мен кластарды қолданудың бірқатар қызықты 
ерекшеліктерін көрсететін мысалды қарастырайық: 
#include  
сlass Class1; // класты алдын ала жариялау 
class Class2; 
{ public : void ff (Class1 &ref); 
}; 
class Class1 
{ private : int x; // достық функциялары мен кластарға арналған 
//жол беру спецификаторының мәні жоқ 
friend int main (void); // main – достық функциясы бола алады 
friend void f (Class1 &ref); 
friend class Class3;
friend void Class2 :: ff (Class1 &ref); 
}; //Class1 анықтамасының соңы 
class Class3
// Class3 – Class1 класына дос
{ public : void func (Class1 &ref) 
{ ref.x=9; 


17 
return; 

}; 
void Class2 :: ff (Class1 &ref) 
{ ref.x=11; 
return; 

//f – Class1 класына дос қарапайым сыртқы функция 
void f (Class1 &ref) 
{ ref.x=7; 
return; 

int main (void)
{Class1 obj1; 
obj1.x=5; 
cout << “obj.1x=” << obj1.x << endl; //x=5 
f(obj1); 
cout<<“obj1.x=” << obj1.x <Сlass3 obj3; 
obj3.func(obj1) 
cout<< “obj1.x=” << obj1.x <Class2 obj2; 
Obj2.ff(obj1); 
cout<< “obj1.x=” <return 0; 
} // main соңы
 
Достық функциясының ерекшеліктері: 
-
достық функция класс объектісіне автоматты түрде this нұсқауышын 
ала алмайды, сондықтан оның шақыруында міндетті түрде аргумент ретінде 
оған жұмыс істеуге қажет класс объектісін көрсету керек; 
-
консольды қосымшаның басты функциясы класқа дос болуы мүмкін; 
-
қажетсіз достық функциялары мен кластарын қолдануға ұмтылмау 
керек, себебі бұл инкапсуляция концепциясына кері болып табылады. 
 
Кластарға арналған операциялардың қайта жүктелуі (перезагрузка). 
С++ тілінің көптеген @ операциялары қолданушы типтерінің 
объектілерімен жұмыс істеу үшін қайта жүктелуі мүмкін. Мұндай 
мүмкіндіктер объект-кластар үшін де болады. @ операциясының қайта 
жүктелуі operator @ фунция-операциясы көмегімен жүзеге асырылады, оны 
класс мүшесі немесе достық функциясына айналдыру (қажет емес) немесе 
қарапайым (глобальды) функцияға айналдыруға болады.
Соңғы екі жағдайда функция-оператор ең болмаса бір сілтеме немесе 
нұсқауыш, класс типі бар аргументті қабылдау керек. Сыртқы функция - 


18 
операциясы үшін сәйкес класс мүшелерінің тиесілігін (доступность) ескерген 
жөн. 
Функция - оператор атауы operator қызметші сөзінен, және одан кейін 
орналасқан қайта анықталатын операция белгісінен тұрады. 
Операцияларды қайта жүктеу типті беру, функцияны шақыру ережелері 
ISO/IES14882 халықаралық стандартында берілген. 
 
Көшіріп алу конструкторы. Беттік және тереңдетілген көшіріп алу 
Класс құрамына арнаулы түр конструкторы – көшіріп алу конструкторы 
жатады. Көшіріп алу конструкторының жалғыз параметрі ретінде, осы класс 
объектісіне сілтемені қолданады: 
Classid : Classid (const Classid & obj) 
{ конструктор денесі } 
Көшіріп алу конструкторы жаңа обьект класс типімен бар обьектіні 
көшіріп алу жолымен құрылған кезде шақырылады: 
-
сол типтің басқа бар объектімен инициализациясы және класс типі бар 
жаңа объект анықтаған кезде; 
-
мән бойынша класс типі бар параметр - объект класс әдісіне берілген 
кезде; 
-
return операторы арқылы класс типі бар объект мәнін класс әдісінен 
қайтарылған кезде. 
Егер программалаушы бір де бір көшіріп алу конструкторын құрмаса, 
онда компилятор автоматты түрде қалыпты көшіріп алу конструкторын 
құрады. Мұндай конструктор кластың мәліметтер өрістерінің элемент 
бойынша көшірілуін орындайды (беттік көшіріп алу). Егер өрістердің ең 
болмаса біреуі динамикалық жадының белгілі бір облысына нұсқауыш
болып табылмаса, онда қалыпты конструкторды қолдану программаның 
дұрыс емес, яғни бұрыс жұмысына әкеледі. Осы жағдайда қалыпты көшіріп 
алу конструкторының орнына өзінің көшіріп алу конструкторын жобалап 
алған жөн: 
- беттік көшіруді орындайтын конструктор (нұсқауыштың объектіге 
көшірілуі орындалады, ал объект көшірмесі динамикалық жадыда құрылады); 
- тереңдетілген көшіріп алуы бар конструктор (динамикалық жадыда 
объект көшірмесі құрылады). 
Қорытындысында мынаны қайталайық, егер класта динамикалық 
жадымен жұмыс орындалмаса және конструктор қажет болмаса, онда 
қалыпты көшіріп алу конструкторын қолдану көмегімен көшіріп алу 
конструкторын анықтау керек емес. Осындай кластарды қолданатын 
бағдарламалар дұрыс жұмыс істейді. 
Мүмкіндігінше мән бойынша, класс типі бар параметрді кластың 
әдісіне және класс типі бар объекттің мәнін емес, сілтемесін оған класс әдісіне 


19 
қайтарудан аулақ болған жөн. Бұл жағдайда көшіріп алу конструкторы қажет 
емес, бұл қосымшаның шапшаңдығының жоғарылауына әкеледі. 
Көрсетілген мақсатқа жету үшін келесі ережелерді қолданған жеткілікті: 
-
мән бойынша класс типі бар параметрді, класс әдісіне берудің орнына 
бұл параметрді сілтемемен берген жөн, ал сәйкес аргументтің 
модификациясын тоқтату үшін функция параметрін const модификаторымен 
қамтамасыз ету керек; 
-
класс типі бар объектілер үшін арифметикалық операцияларды қайта 
жүктегенде қайта жүктеу әдісін объектке қайтаратындай етіп жобалау керек 
(оны әрқашанда орындауға болады). 
Бақылау сұрақтары: 
1)
C++ тілінің операцияларын қайта жүктеу операциялары қандай? 
2)
Көшіріп алу конструкторы қашан шақырылады? 
3)
Бірігіп көшу операторларының префиксті және постфиксті қайта 
жүктеуін қалай айыруға болады? 
4)
short int типті операндалар үшін қосынды операциясын қайта 
жүктеуге бола ма? 


Достарыңызбен бөлісу:
1   ...   5   6   7   8   9   10   11   12   ...   23




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

    Басты бет