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 типті операндалар үшін қосынды операциясын қайта
жүктеуге бола ма?
Достарыңызбен бөлісу: