Объектга йўналтирилган программалаш
Nuqta nuqta1, nuqta2, nuqta3
Download 0.58 Mb.
|
С ОЙП
- Bu sahifa navigatsiya:
- Оператор Тавсифи Тоифаси
- Оператор Тавсифи
- Бинар операторларни қайта юклаш
- include class Nuqta { int x,y; public: Nuqta(){x=0; y=0;} Nuqta(int _x,int _y){x=_x; y=_y;}
- Nuqta Nuqta::operator+(Nuqta ob) { Nuqta OraliqOb; OraliqOb.x=x+ob.x; OraliqOb.y=y+ob.y; return OraliqOb; }
- cout return 0; }
- C=A+B-C; Иккинчи томондан, қуйидаги ифода ҳам ўринли: (A+B).Nuqta_Qiymati(x,y);
Nuqta nuqta1, nuqta2, nuqta3;
// Қайта юкланган қўшиш операторини ошкор чақириш nuqta3=nuqta1.operator+(nuqta2); 13.1–жадвал. Қайта юкланувчи операторлар
13.2–жадвалда келтирилган операторлар қайта юкланмайдиган операторлар ҳисобланади. 13.2–жадвал. Қайта юкланмайдиган операторлар
Қайта юкланадиган операторларнинг оператор функциялари, new ва delete операторларидан ташқари, қуйидаги қоидаларга бўйсуниши керак: 1) оператор функция синфнинг ностатик функция–аъзоси бўлиши керак ёки оператор функция синф ёки санаб ўтиладиган турдаги аргумент қабул қилиши керак ёки оператор функция синф ёки санаб ўтиладиган турга кўрсаткич ёки мурожаат бўлган аргументларни қабул қилиши керак. Масалан, class Nuqta { public: //«кичик» оператори учун оператор функция-аъзони // эълон қилиш Nuqta operator<(Point&); … // Қўшиш операторларини эълон қилиш friend Nuqta operator+(Point&, int); friend Nuqta operator+(int, Point&); }; Бу мисолда «кичик» оператори синфнинг функция–аъзоси сифатида эълон қилинган, қўшиш оператори эса синфнинг дўсти сифатида эълон қилинган ва у битта операторни қайта юклашнинг бир нечта варианти бўлиши мумкинлигини кўрсатади; 2) оператор функция операторнинг аргументлар (операндлар) сонини, уларнинг устунлиги ва бажарилиш тартибини ўзгартира олмайди; 3) синф функция аъзоси сифатида эълон қилинган унар операторнинг оператор функцияси параметрга эга бўлмаслиги керак. Агар оператор функция глобал функция бўлса, у фақат битта параметрга эга бўлади; 4) синф функция аъзоси сифатида эълон қилинган бинар операторнинг оператор функцияси битта параметрга эга бўлиши керак. Агар оператор функция глобал функция бўлса, у фақат иккита параметрга эга бўлади; 5) оператор функция келишув бўйича параметрларга эга бўлмаслиги керак; 6) синф функция аъзоси сифатида эълон қилинган оператор функциянинг биринчи параметри (агар у бўлса) синф турида бўлиши керак. Чунки айнан шу синф объекти учун мазкур оператор чақирилади. Биринчи аргумент устида ҳеч қандай турга келтириш амали бажарил–маслиги керак; 7) қиймат бериш операторининг оператор функциясидан ташқари барча оператор функциялар ворислик билан ўтади; 8) =, ( ), [ ] ва -> операторларнинг оператор функциялари синфнинг ностатик функция аъзолари бўлиши керак (ва улар глобал функция бўла олмайди). Операторларни қайта юклаш орқали, синф чегарасида операторнинг моҳиятини тубдан ўзгартириб юбориш мумкин. Лекин бу ишни зарурат бўлгандагина амалга оширган маъқул. Акс ҳолда бажариладиган амал–ларда мазмуний хатолар юзага келиши мумкин. Бинар операторларни қайта юклаш Бинар операторнинг оператор функцияси синфнинг ностатик функция–аъзоси сифатида эълон қилинганда у қуйидаги синтаксисга эга бўлиши керак: <қайтариладиган қиймат тури>operatorX(<параметр тури><параметр>); Бу ерда <қайтариладиган қиймат тури> – функция қайтарадиган қиймат тури, X– қайта юкланадиган оператор, <параметр тури> –параметр тури ва <параметр> – функция параметри. Функция параметрига операторнинг ўнг томонидаги объект узатилади, операторнинг чап томонидаги объект эса ноошкор равишда this кўрсаткичи билан узатилади. Агар оператор функция глобал деб эълон қилинса, у қуйидаги кўринишга эга бўлади: <қайтариладиган қиймат тури>operatorX(<параметр тури1><параметр1>, <параметр тури2><параметр2>); Бу ерда функция параметрларининг камида биттаси оператор қайта юкланаётган синф турида бўлиши керак. Гарчи оператор функция қайтарадиган қиймат турига ҳеч қандай чеклов бўлмаса ҳам, у синф турида ёки синфга кўрсаткич бўлади. Оператор функцияларни ёзишнинг бир нечта мисолларини келтирамиз. Бу мисоллар операторларни қайта юклашнинг тўлиқ имкониятларини очиб бермаса ҳам, унинг муҳим қирраларини кўрсатади. Биринчи навбатда оператор функциянинг синфнинг функция–аъзоси кўринишида аниқлашни кўрамиз. Қуйидаги программада Nuqta синфи учун қўшиш ва айириш операторларини қайта юклаш амалга оширилган. #include class Nuqta { int x,y; public: Nuqta(){x=0; y=0;} Nuqta(int _x,int _y){x=_x; y=_y;} void Nuqta_Qiymati(int & _x,int & _y){_x=x; _y=y;} Nuqta operator+(Nuqta& ob); Nuqta operator-(Nuqta& ob); }; Nuqta Nuqta::operator+(Nuqta& ob) { Nuqta OraliqOb; OraliqOb.x=x+ob.x; OraliqOb.y=y+ob.y; return OraliqOb; } Nuqta Nuqta::operator-(Nuqta& ob) { Nuqta OraliqOb; OraliqOb.x=x-ob.x; OraliqOb.y=y-ob.y; return OraliqOb; } int main() { int x,y; Nuqta A(100,200), B(50,100),C; C=A+B; // қайта юкланган қўшиш оператори амал қилади C.Nuqta_Qiymati(x,y); cout<<" C=A+B: "<<"C.x="< C=A+B-C; Иккинчи томондан, қуйидаги ифода ҳам ўринли: (A+B).Nuqta_Qiymati(x,y); Бу ифодада қўшиш операторинг оператор функциясидаги вақтинча (OraliqOb) объектнинг Nuqta_Qiymati() функцияси ишлатилади. Кейинги мисол оператор функция параметри сифатида санаб ўтиладиган турдаги берилган келган ҳолатини намоён қилади. Бу берилган операторнинг ўнг томонида келишига эътибор бериш керак. #include class Nuqta { int x,y; public: Nuqta(){x=0; y=0;} Nuqta(int _x,int _y){x=_x; y=_y;} void Nuqta_Qiymati(int & _x,int & _y){_x=x; _y=y;} Nuqta operator+(Nuqta& ob); Nuqta operator+(int n); }; Nuqta Nuqta::operator+(Nuqta& ob) { Nuqta OraliqOb; OraliqOb.x=x+ob.x; OraliqOb.y=y+ob.y; return OraliqOb; } Nuqta Nuqta::operator+(int n) { Nuqta OraliqOb; OraliqOb.x=x+n; OraliqOb.y=y+n; return OraliqOb; } int main() Download 0.58 Mb. Do'stlaringiz bilan baham: |
Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling
ma'muriyatiga murojaat qiling