Объектга йўналтирилган программалаш


Nuqta nuqta1, nuqta2, nuqta3


Download 0.58 Mb.
bet35/71
Sana08.05.2023
Hajmi0.58 Mb.
#1444224
TuriПрограмма
1   ...   31   32   33   34   35   36   37   38   ...   71
Bog'liq
С ОЙП

Nuqta nuqta1, nuqta2, nuqta3;
// Қайта юкланган қўшиш операторини ошкор чақириш
nuqta3=nuqta1.operator+(nuqta2);
13.1–жадвал. Қайта юкланувчи операторлар

Оператор

Тавсифи

Тоифаси

,

Вергул

Бинар

!

Мантиқий инкор

Унар

!=

Тенг эмас

Бинар

%

Бўлиш қолдиғи

Бинар

%=

Модулли бўлиш қиймат бериш билан

Бинар

&

Разрядли ВА

Бинар

&

Адресни олиш

Унар

&&

Мантиқий ВА

Бинар

&=

Разрядли ВА қиймат бериш билан

Бинар

( )

Функцияни чақириш



*

Кўпайтириш

Бинар

*

Воситали мурожаат

Бинар

*=

Кўпайтириш қиймат бериш билан

Бинар

+

Қўшиш

Бинар

+

Унар плюс

Унар

++

Инкремент

Унар

+=

Қўшиш қиймат бериш билан

Бинар



Айириш

Бинар



Унар минус

Унар

– –

Декремент

Унар

– =

Айириш қиймат бериш билан

Бинар

->

Элементини танлаш

Бинар

->*

Элементини кўрсаткич орқали танлаш

Бинар

/

Бўлиш

Бинар

/=

Бўлиш қиймат бериш билан

Бинар

<

Кичик

Бинар

<=

Кичик ёки тенг

Бинар

<<

Разряд бўйича чапга суриш

Бинар

<<=

Чапга суриш қиймат бериш билан

Бинар

=

Қиймат бериш

Бинар

= =

Тенг

Бинар

>

Катта

Бинар

>=

Катта ёки тенг

Бинар

>>

Разряд бўйича ўнгга суриш

Бинар

>>=

Ўнгга суриш қиймат бериш билан

Бинар

[ ]

Массив индекси



^

Разрядли истисно қилувчи ЁКИ

Бинар

^=

Разрядли истисно килувчи ЁКИ қиймат бериш билан

Бинар

|

Разрядли ЁКИ

Бинар

|=

Разрядли ЁКИ қиймат бериш билан

Бинар

| |

Мантиқий ЁКИ

Бинар

~

Битли мантиқий ИНКОР

Бинар

delete

Динамик объектни йўқотиш



new

Динамик объектни яратиш



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:
1   ...   31   32   33   34   35   36   37   38   ...   71




Ma'lumotlar bazasi mualliflik huquqi bilan himoyalangan ©fayllar.org 2024
ma'muriyatiga murojaat qiling