+, -, *, /, %, &, |, ^, <<, >>
|
Ushbu binar operatsiyalar qaytayuklanishi mumkin
| | | | |
Bu taqqoslash operatsiyalari qayta yuklanishi mumkin. C# (< va >, <= va >=, == va != shu kabi) “shunga o`xshash” operatsiyalarga birgalikdagi qayta yuklashni talab qiladi
| | | | |
[] operatsiyasi qayta yulanishi mumkin emas. Biroq, indeksatorlar shunga o'xshash funktsiyani taklif qilishadi.
| | | | |
() operatsiyasi qayta yulanishi mumkin emas. Shu bilan bir xil funktsionallik maxsus konversiya usullari bilan ta'minlanadi
| | | |
+=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
|
Qisqartirilgan amallar qayta yuklanmaydi; lekin ular mos binar operatsiyalarni qayta yuklash bilan avtomat yuz beradi
| | | | | | | | | Binar operatorlarni qayta yuklash
namespace ConsoleApplication1
{
class MyArr
{
// Uch o`lchovli fazoda koordinatalar
public int x, y, z;
public MyArr(int x = 0, int y = 0, int z = 0)
{
this.x = x;
this.y = y;
this.z = z;
}
2 Har qanday binar amal ikki usul bilan aniqlanadi, yoki bir parametrli kompanenta funktsiya sifatida yoki global yoki do’stona global ikki parametrli funktsiya. Birinchi holda x*y ifoda h. Operator*(y) murojaatni ikkinchi holda esa Operator*(x*y) murojaatni bildiradi.
Binar '=', '[ ]', '->' amallar semantikasiga ko’ra Operator=, Operator[ ], Operator-> global funktsiya bo’lolmaydi. Balkim nostatik kompanenta funktsiyasi bo’lishi lozim.
Har qanday amal '$' sinf ob'ektlari uchun ikki usulda aniqlanadi yoki parametrsiz komponenta funktsiya yoki bir parametrli (balkim do’stona) global funktsiya. Prefiks amal uchun xz ifoda , postfiks amal uchun Z ifoda komponenta funktsiya z.operator*( ) yoki global funktsiya operator*(z) chaqirilishini bildiradi. C++ tilida ba'zi amallarni boshqa amallarning kombinatsiyasi sifatida aniqlanadi.
Misol uchun j+m butun son uchun m+=1ni bu amal bo’lsa m=m+1 ni bildiradi. Bunday avtomatik almashtirishlar qo’shimcha yuklangan amallar uchun bajarilmaydi. Misol uchun umumiy holda operator*=() ta'rifni operator*( ) ta'rif va operator=( ) ta'rifdan keltirib chiqarib bo’lmaydi.
Agar ifodada foydalanuvchi kiritgan sinf ob'ekti qatnashmasa uning ma'nosini o’zgartirib bo’lmaydi. Misol uchun faqat ko’rsatkichlarga ta'sir qiluvchi amallarni kiritish mumkin emas.
Agar operatsiya funktsiyaning birinchi parametri standart tip bo’lishi kerak bo’lsa, bunday operatsiya-funktsiya kompanenta-funktsiya bulolmaydi. Misol uchun aa- biror sinf ob'ekti bo’lsin va uning uchun '+' amali qo’llangan bo’lsin. AA+2 ifoda uchun yoki AA.operator(2) yoki operator+(AA,2) ifoda chaqirilishi mumkin. 2++AA ifoda uchun operator+(AA,2) chaqirilishi mumkin lekin z. operator+(AA) hatoga olib keladi. Amallar kengaytirilganda ular uchun har hil tiplar qolib inatsiyasini oldindan nazarda tutish lozim. Lekin operatsiya-funktsiyalarga murojaat qilinganda standart tiplar almashinuvchi qoidalari ishlatiladi, shuning uchun tiplarning hamma kombinatsiyalarini hisobga olish zarurati yuq. Kupgina hollarda binar amallar uchun qo’yidagi hollarni hisobga olish etarlidir.
#include
using namespace std;
class sonlar {
private:
public:
int butun ;
float xaqiqiy ; };
istream &operator>> (istream &k, sonlar &x)
{cout<<"butun sonlar"; k>>x.butun ;
cout<<"xaqiqiy sonlar"; k>>x.xaqiqiy ;
} sonlar operator + (sonlar x,sonlar y)
{ sonlar z;
z.butun = x.butun + y.butun;
z.xaqiqiy = x.xaqiqiy + y.xaqiqiy;
return z;
} ostream &operator<<(ostream &k, sonlar &x)
{ k<} int main()
{ sonlar a,b,c;
cout <<"a="; cin>>a; cout<<"b="; cin>>b; c= a+b; cout <return 0;}
S ++ tilining ajoyib hususiyatlaridan biri standart amallarni yangi ma'lumotlar turlariga kullash imkoniyatidir. Masalan satrlani ulashni S1=S2 kurinishda belgilash ancha ulaydir. Bu amalni simvolli massivlarga yoki satrli konstantalarga qo’llashning iloji yo’q. Lekin S1 va S2 ni biror sinf ob'ektlari sifatida (masalan Stroka sinf) tavsiflansab ular uchun amalini kiritish mumkin bo’ladi. Amalni ma'lumotlarning yangi tipiga qo’llash uchun dasturchi “ operatsiya – funktsiya “ deb ataluvchi mahsus funktsiyani kiritishi lozim. Operatsiya – funktsiya ta'rifi qo’yidagicha.
Qaytariluvchi_ma'lumot_tini operator operatsiya_belgisi
( operatsiya-funktsiya-parametrlari-spetsifikatsiyasi )
{ operatsiya-funktsiya-tanasi-operatorlari }
Kerak bo’lganda bu funktsiya operator prototipini kiritish mumkin.
Qaytariluvchi-ma'lumot-tipi+operator operatsiya-belgisi
{ operatsiya-funktsiya-parametrlari-spetsifikatsiyasi )
Misol uchun * amalni biror T sinfga tegishli ob'ektlarga qo’llash uchun qo’yidagicha funktsiya e'lon qilishi mumkin:
T operator * ( Tx,Ty )
Bu usulda ta'riflangan operatsiya qo’shimcha yuklangan (inglizchasiga-overload) deb ataladi. Agar T sinf uchun yuqorida keltirilgan turdagi funktsiya e'lon qilingan bo’lsa, A*V ifoda operator (A,V) sifatida qaraladi. Sinf ob'ektlariga funktsiya-operatorni qo’llash uchun operatsiya-funktsiya yoki sinf kompanenta funktsiyasi yoki do’stona funktsiya bo’lishi, eki parametrlardan birortasi sinf tipiga ega bo’lishi kerak. Qo’yidagi misolda amalini satrlarga qo’llash usuli kursatilgan. Buning uchun len – satr uzunligi , ch-simvolli massivga ko’rsatkich parametrlardan iborat. Streko sinfidan foydalanamiz. Bu sinfda ikki konstruktor mavjuddir. Birinchisi yaratilaetgan ob'ekt uchun hotiradan satr sifatida joy ajratadi. Ikkinchisi haqiqiy parametr asosida ob'ekt yaratadi. Sinfdan tashkarida operatsiya-funktsiyani qo’yidagicha S bilan aniqlaymiz:
Strka & operator + (stroka & A, stroka & B),
Bu operatsiya-funktsiya ‘+’ amalini stroka sinfiga tegishli ob'ektlarga qo’llash uchun ishlatiladi. Funktsiya operatsiya tanasi asosiy dasturdan keyin keltirilgan, shuning uchun asosiy dasturda bu funktsiyaning prototipi joylashtirilgan.
7. : Аsоsi uchburchаkdаn ibоrаt bo’lgаn prizmаni ifоdаlоvchi klаss yarаting
#include
using namespace std;
class uchprizma
{ public: float a; float b; float c; float v;
uchprizma ();
void kiritish()
{
cout<<" eni ni kiriting=";
cin>>a;
cout<<" bo'yini kiriting=";
cin>>b;
cout<<" balandligini kiriting=";
cin>>c;
} void chiqarish()
{ cout<<" uchburchak prizma hajmi=";
v=(a*b*c)/2;
cout<~uchprizma(){cout<<" obekt o'chirildi\n";}
float yuza(); };
uchprizma::uchprizma(){cout<<" obyekt yaratildi\n";}
int main()
{ uchprizma s;
s.kiritish();
s.chiqarish(); return 0; }.
Do'stlaringiz bilan baham: |