This ko’rsatkichi.
Agarda konkret ob’ektga ishlov berish uchun sinf a’zosi –funksiya
chaqirilsa, unda shu funksiyaga ob’ektga belgilangan ko’rsatkich avtomatik va
ko’rsatilmagan holda uzatiladi. Bu ko’rsatqich this ismiga ega va x* this kabi har
bir funksiya uchun ko’rsatilmagan holda belgilanadi.
Masalan x sinfni ekvivalent ko’rinishda shunday tavsiflash mumkin:
class x {
int m;
public:
int readm() { return this->m; }
};
A’zolarga murojaat etishda this dan foydalanish ortiqcha. Asosan this
bevosita ko’rsatkichlar bilan manipulyasiya qilish uchun a’zo funksiyalarini
yaratilishida foydalaniladi.
#include
using namespace std;
class Pair
{
int N;
double x;
friend Pair& operator ++(Pair&);
friend Pair& operator ++(Pair&, int);
public:
Pair (int n, double xn)
{ N= n; x = xn;
}
void display ()
{
cout<<"\n Koordinatalar: N = "<
}
Pair& operator --()
{
N/ = 10; x/ = 10;
return*this;
}
Pair& operator --(int k)
{
N/ = 2;
x/ = 2.0;
return*this;
}
};
Pair& operator ++(Pair& P)
{
P.N* = 10; P.x* = 10;
return P;
}
Pair& operator ++(Pair& P, int k)
{
P.N = P.N*2+k;
P.x = P.x*2+k;
return P;
}
int main ()
{
Pair Z(10,20.0);
Z.display();++Z;
Z.display();--Z;
Z.display();Z++;
Z.display();Z--;
Z.display();
return 0;
}
2. Sinflarni boshqa sinflardan tashkil topishi.
Oqimli sinflar va ob’ektlar.
Obyekt maydon sifatida. Murakkab sinflarni hosil qilishda oldin uni tashkil
etuvchi oddiyroq sinflarni e’lon qilib, keyin esa ularni birlashtirish orqali sinfni
hosil qilish maqsadga muvofiqdir. Masalan, g’ildirak sinfi, motor sinfi, uzatish
korobkasi sinfi va boshqa sinflarni hosil qilib, keyin esa ularni birlashtirish orqali
avtomobil sinfini qurish oldimizga turgan masalani yechishni ancha osonlashtiradi.
To’g’ri to’rtburchak chiziqlardan tashkil topgan. Chiziq esa ikki nuqta orqali
aniqlanadi. Har bir nuqta x va u koordinatalar yordamida aniqlanadi. Quyidagi
dasturda to’rtburchak sinfi ko’rsatilgan. To’g’ri to’rtburchak diagonal bo’yicha ikki
nuqta va ikki tomon yordamida aniqlanadi.
Shuning uchun oldin har bir nuqtaning x, u koordinatalarini saqlash uchun
nuqta
sinfi e’lon qilingan.Nuqta va to’g’rito’rtburchakning e’lon qilinishi
#include
using namespace std;
class Point
{
public:
Point(int x1 = 0,int y1 = 0)
{ x= x1;y = y1;
}
int GetX() const {return x;}
int GetY() const {return y;}
private:
int x;int y;
};
class Rectangle
{
public:
Rectangle(int x1,int y1,int x2,int y2):
p1(x1,y1),p2(x2,y2)
{ a= x2-x1;
b = y2-y1;
};
Rectangle(Point a1,Point a2):p1(a1),p2(a2)
{ a= a2.GetX() - a1.GetX();
b = a2.GetY() - a1.GetY();
};
int Per() { return 2*(a+b); }
int Sq() {return a*b; }
private:
Point p1,p2;
int a,b;
};
int main()
{
Rectangle X(10, 20, 50, 80);
cout << "Perimetr = "<
cout << "Yuza = "<
cout<
Point a(2,4);Point b(5,6);
Rectangle Y(a,b);
cout << "Perimetr = "<
cout<<"Yuza = "<
return 0;
} Natija:
Perimetr = 200
Yuza = 2400
Perimetr = 10
Yuza = 6
Lokal sinflar. Sinf blok ichida, masalan funksiya tomonida tariflanishi mumkin.
Bunday sinf lokal sinf deb ataladi. Lokal sinf komponentalariga shu sinf
tariflangan blok yoki funksiya tashqarisida murojaat qilish mumkin emas.
Lokal
sinf statik komponentlarga ega bo’lishi mumkin emas. Lokal sinf ichida shu sinf
aniqlangan soniga tegishli nomlari; statik (static) o’zgaruvchilar; tashqi (extern)
o’zgaruvchilar va tashqi funksiyalardan foydalanish mumkin. Avtomatik xotira
turiga tegishli o’zgaruvchilardan foydalanish mumkin emas. Lokal sinflar
komponent funksiyalari faqat joylashinuvchi (inline) funksiya bo’lishi mumkin.
Quyidagi misolda moddiy nuqta sinfi yaratilib, uning ichida nuqta sinfiga
ta’rif berilgan va nuqta sinfi ob’ekti maydon sifatida kelgan:
#include
using namespace std;
class FPoint
{
public:
//Nuqta sinfi
class Point
{
public:
Point(int x1 = 0,int y1 = 0)
{ x= x1;y = y1;
}
int GetX() const {return x;}
int GetY() const {return y;}
private:
int x;int y;
};
FPoint(int x1,int y1,double w1):p(x1,y1),w(w1){};
void show()
{
cout<<"koordinata x = "<
cout<<"koordinata y = "<
cout<<"massa w = "<
}
private:
Point p;
double w;
};
int main()
{
cout<<"fizik nuqta"<
FPoint X(1, 2, 5.5);
X.show();
cout<<"\n\noddiy nuqta"<
FPoint::Point Y(2,3);
cout<<"koordinata x = "<
cout<<"koordinata y = "<
return 0;
}
Natija:
fizik nuqta
koordinata x = 1
koordinata y = 2
massa w = 5.5
oddiy nuqta
koordinata x = 2
koordinata y = 3
Oddiy nuqta sinfi moddiy nuqta sinfining umumiy seksiyasiga
joylashtirilgan.Dasturda moddiy nuqta sinfi ob’ektidan tashqari nuqta sinfi
ob’ekti ham yaratilgan. Lekin bu sinf nomi oldida moddiy nuqta nomi va
kvalifikasiya operatori joylashtirilgan.
Keyingi misolimizda nuqta sinfi ta’rifi moddiy nuqta sinfining xususiy
elementlari seksiyasiga joylashtirilgan:
#include
using namespace std;
class FPoint
{
public:
FPoint(int x1,int y1,double w1):p(x1,y1),w(w1){};
void show()
{
cout<<"koordinata x = "<
cout<<"koordinata y = "<
cout<<"massa w = "<
}
private:
//Nuqta sinfi
class Point
{
public:
Point(int x1 = 0,int y1 = 0)
{ x= x1;y = y1;
}
int x;int y;
};
Point p;
double w;
};
int main()
{
cout<<"fizik nuqta"<
FPoint X(1, 2, 5.5);
X.show();
int kk;cin>>kk;
return 0;
} Natija:
fizik nuqta
koordinata x = 1
koordinata y = 2
massa w = 5.5
Bu misolda nuqta sinfi hamma elementlari umumiy, lekin dasturda bu
sinfdan foydalanib bo’lmaydi.
Oqimli sinflar va ob’ektlar
Oldindan belgilangan ob’ektlar va oqimlar. C++da kiritish-chiqarish
oqimlarining sinflari mavjud bo’lib, ular kiritish-chiqarish standart kutubxonasi
(stdio.h) ning ob’ektga mo’ljallangan ekvivalenti (stream.h) dir. Ular quyidagicha:
Standart oqimlar (istream, ostream, iostream) terminal bilan ishlash uchun
xizmat qiladi.
Satrli oqimlar (istrstream, ostrstream, strstream) xotirada joylashtirilgan satrli
buferlardan kiritish-chiqarish uchun xizmat qiladi.
Faylli oqimlar (ifstream, ofstream, fstream ) fayllar bilan ishlash uchun
xizmat qiladi.
Quyidagi ob’ekt-oqimlar dasturda main funksiyasini chaqirish oldidan avvaldan
aniqlangan va ochilgan bo’ladi:
extern istream cin; //Klaviaturadan kiritish standart oqimi
extern ostream cout; //Ekranga chiqarish standart oqimi
extern ostream cerr; //Xatolar haqidagi xabarlarni chiqarish standart oqimi
(ekran)
extern ostream cerr: //Xatolar haqidagi xabarlarni chiqarishning
buferlashtirilgan standart oqimi.
Bu ob’ektlar joylashgan faylda kiritish-chiqarish operasiyalar ta’riflari ham
berilgandir. Birinchi operasiya >> «o’ngga» surish amali, orqali belgilanib oqimdan
o’qish deb ataladi.Ikkinchi operasiya << «chapga» surish amali orqali belgilanib
oqimga chiqarish yoki yozish amali deb ataladi. Oqimga o’qish va yozish amallari
<< va >> amallarini qo’shimcha yuklash orqali hosil qilingan bo’lib, chap operasiya
iostream va ostream sinfi ob’ekti bo’lsa o’ng o’zgaruvchi yoki ifodadir. Bu
o’zgaruvchi, konstanta yoki ifoda turi char, unsigiod short, signed short, signed
int,unsigned int, signed long, unsigned long, flout, double, long double, char, void
bo’lishi mumkin. Shuni aytish kerakki char turidan tashqari hamma ko’rsatkichlar
void turiga keltiriladi.
Oqim bilan almashish funksiyalari. Oqimga qo’shish << va oqimdan o’qish
>> amallardan tashqari, kirish –chiqish bibliotekalarida qo’shishga foydali
funksiyalar mavjud. Ma’lumotlarni chiqarishda ostream sinfi ishlatiladi. Bu sinfda
quyidagi chiqarish funksiyalari mavjud.
ostream & put (char cc );
ostream & write (const signed char *array,int u);
ostream & write (const nn signed char *array,int u);
put() funksiya chiquvchi oqimga bitta simvol joylaydi:
cout .put (‘Z’);
write() – funksiyasi ikki parametrga ega
array –xotira qismiga ko’rsatkich va n- simvollar soni.
Chiqarish uchun put funksiyasidan foydalanishga misol:
#include
using namespace std;
int main()
{cout.put('a').put('b').put('c').put('\n');
return 0;}
Natija
abc
Satr chiqarish uchun write funksiyasidan foydalanishga misol:
#include
using namespace std;
int main() {
char ss [] = "merci";
cout.write (ss,sizeof (ss)-1);
return 0;
}
Natija
merci
Do'stlaringiz bilan baham: |