Klasslar va obektlar. Konstruktorlar va destruktorlar
Reja:
1. Obektlar bilan ishlash va klasslar
2. Konstruktor va destruktorlar
C++ tilida obyektlar bilan ishlash
Har qanday dasturning strukturasi tarmoqlanish va sikllar to’plamining kombinasiyasidan iborat bo’ladi.Obektga mo’ljallangan yondoshuv bir kunda o’ylab topilgan yemas. Uning paydo bo’lishi dasturiy ta’minotning tabiiy rivojidagi navbatdagi pog’ona xolos. Vaqt o’tishi bilan qaysi uslublar ishlash uchun qulay-u, kaysinisi noqulay yekanini aniqlash oson bo’lib bordi. Obektga mo’ljallangan yondoshuv yeng muvaffaqiyatli, vaqt sinovidan o’tgan uslublarni o’zida samarali mujassam yetadi.Ob’yekt - mavhum (abstrakt) mohiyat bo‘lib, u bizni o‘rab turgan haqiqiy olamning tavsiflariga ega. Ob’yektlarni yaratish va ular ustida manipulyatsiyalar olib borish - C++tilining qandaydir alohida imtiyozi emas, balki ob’yektlarning tavsifi va ular ustida o‘tkaziladigan opyeratsiyalarni kodli konstruktsiyalarda o‘zida mujassamlantiradigan dasturlash myetodologiyasi (uslubiyoti) ning natijasidir. Dasturning har bir ob’yekti, har qanday haqiqiy ob’yekt kabi, o‘z atributlari va o‘ziga xos xulq-atvori bilan ajralib turadi. Ob’yektlarni turli katyegoriyalarga ko‘ra tasniflash mumkin: masalan, myening «Cassio» raqamli qo‘l soatim soatlar sinfiga mansub. Soatlarning dasturiy ryealizatsiyasi (ishlatilishi), standart holat sifatida, sizning kompyutyeringizning opyeratsiya tizimi tarkibiga kiradi.C ++ sinflari / ob'ektlari
C ++ - ob'ektga yo'naltirilgan dasturlash tili.
C ++ da hamma narsa atributlari va usullari bilan bir qatorda sinflar va ob'ektlar bilan bog'liq. Masalan: real hayotda mashina ob'ektdir. Mashinada og'irlik va rang kabi atributlar, haydash va tormoz kabi usullar mavjud.Xususiyatlar va usullar asosan sinfga tegishli o'zgaruvchilar va funktsiyalardir. Ular ko'pincha "sinf a'zolari" deb nomlanadi.
Sinf - bu bizning dasturimizda foydalanishimiz mumkin bo'lgan foydalanuvchi tomonidan aniqlangan ma'lumotlar turi va u ob'ektlar konstruktori yoki ob'ektlarni yaratish uchun "loyiha" sifatida ishlaydi.
Sinf yarating
Sinf yaratish uchun class kalit so'zidan foydalaning:
Misol
"MyClass" nomli sinf yarating:
sinf MyClass {// Sinf
public: // Kirish spetsifikatori
int myNum; // Attribute (int o'zgaruvchisi)
string myString; // Xususiyat (satr o'zgaruvchisi)
};
Misol tushuntirildi
Class kalit so'zi MyClass nomli sinf yaratish uchun ishlatiladi.
Ochiq kalit so'z - bu sinf a'zolari (atributlari va usullari) ga sinf tashqarisidan kirish imkoniyatini belgilaydigan kirish spetsifikatori. Kirish spetsifikatorlari haqida keyinroq bilib olasiz.
Sinf ichida myNum butun o'zgaruvchisi va myString mag'lubiyatga o'zgaruvchisi mavjud. O'zgaruvchilar sinf ichida e'lon qilinganda, ular atributlar deb ataladi.
Nihoyat, sinf ta'rifini nuqta-vergul bilan yakunlang;.
Ob'ekt yarating
C ++ da ob'ekt sinfdan yaratiladi. Biz allaqachon MyClass nomli sinfni yaratganmiz, shuning uchun endi undan ob'ektlar yaratish uchun foydalanishimiz mumkin.
MyClass ob'ektini yaratish uchun sinf nomini, so'ngra ob'ekt nomini ko'rsating.
Sinf atributlariga (myNum va myString) kirish uchun ob'ektdagi nuqta sintaksisidan (.) Foydalaning:
Misol
"MyObj" deb nomlangan ob'ekt yarating va atributlarga kiring:
sinf MyClass {// Sinf
public: // Kirish spetsifikatori
int myNum; // Attribute (int o'zgaruvchisi)
string myString; // Xususiyat (satr o'zgaruvchisi)
};
int main () {
MyClass myObj; // MyClass ob'ektini yarating
// Attributlarga kirish va qiymatlarni o'rnatish
myObj.myNum = 15;
myObj.myString = "Ba'zi matnlar";
// Atribut qiymatlarini chop etish
cout << myObj.myNum << "\ n";
cout << myObj.myString;
return 0;
}
Bir nechta ob'ekt
Siz bitta sinfning bir nechta ob'ektlarini yaratishingiz mumkin:
Misol
// Ba'zi atributlar bilan Car sinfini yarating
sinf avtomobili {
jamoat:
string markasi;
mag'lubiyat modeli;
int yil;
};
int main () {
// Avtomobil ob'ektini yarating
CarObj1 avtomashinasi;
carObj1.brand = "BMW";
carObj1.model = "X5";
carObj1.year = 1999;
// Avtomobilning boshqa ob'ektini yarating
CarObj2 avtomashinasi;
carObj2.brand = "Ford";
carObj2.model = "Mustang";
carObj2.year = 1969;
// Atribut qiymatlarini chop etish
cout << carObj1.brand << "" << carObj1.model << "" << carObj1.year << "\ n";
cout << carObj2.brand << "" << carObj2.model << "" << carObj2.year << "\ n";
return 0;
}
Konstruktorlar va dyestruktorlar
Nomlaridan ko‘rinib turganidyek, konstruktor - bu myetod bo‘lib, u o‘z xotirasida ushbu sinf ob’yektini quradi, dyestruktor esa - bu ob’yektni olib tashlaydigan myetod. Konstruktorlar va dyestruktorlar boshqa ob’yektli myetodlardan quyidagi xususiyatlariga ko‘ra afrqlanadi:
O‘z sinfi nomi bilan bir xil bo‘lgan nomga ega.
Qaytariladigan qiymatga ega emas.
Garchi hosila sinf bazaviy sinflarning konstruktorlari va dyestruktorlarini chaqira olsa-da, konstruktor va dyestruktorlarning o‘zlari vorislik qilolmaydi.
Agar boshqacha e’lon qilinmagan bo‘lsa, kompilyator tomonidan avtomatik tarzda public sifatida gyenyeratsiya qilinadi.
Sinf ob’yektlarining yaratilishi va yo‘q qilinishini tyegishli tarzda kafolatlash uchun, kompiyaltor tomonidan chaqirib olinadi.
Agar ob’yekt dinamik xotiraning ajratilishi va yo‘q qilinishini talab qilsa, new va delete opyeratorlariga noaniq murojaatga ega bo‘lishi mumkin.
Quyida konstruktorlar va dyestruktorlar e’lonining umumlashma sintaksisini namoyish qiluvchi misol kyeltiramiz:
class className
{public:
//className ma’lmotlarining boshqa a’zolari; //yashirin className bo‘yicha konstruktor(
className(const className&);//Nusha ko‘chirish konstruktori
//Boshqa konstruktorlar
~className();//Dyestruktor
//Boshqa myetodlar};
Sinf soni chyeklanmagan konstruktorlarga ega bo‘lishi, shu jumladan, konstruktorlarga umuman ega bo‘lmasligi mumkin. Konstruktorlar virtual dyeb e’lon qilinishi mumkin emas. Hamma konstruktorlarni himoyalangan syektsiyaga joylashtirmang hamda, yashirin argumyentlar qiymatidan foydalanib, ularning sonini kamaytirishga intiling.
Ko‘p hollarda sinf ob’yektlarini initsializatsiya qilish (nomlash) ning bir nyechta usullariga ega bo‘lish yaxshi natija byeradi. Bunga bir nyechta konstruktor vositasida erishish mumkin. Masalan:
class date {
int vonth, day, year;
public:
// ...
date(int, int, int); //yilning oyi, kuni
date(char*); //satr ko‘rinishidagi sana
date(int); //bugungi kun, oy, yil
date(); //yashirin sana: bugungisi
};
Ortiqcha yuklangan funktsiyalar qanday qoidalarga amal qilsa, konstruktorlar ham paramyetrlar turlariga nisbatan xuddi shunday qoidalarga amal qiladilar. Agar konstruktorlar o‘z paramtyerlari turlari bo‘yicha ancha-muncha farq qilsa, kompilyator har gal foydalanganda to‘g‘ri paramyetrni tanlab olishi mumkin:
date today(4);
date july4(«1983 yil, 4 iyul»);
date guy(«5 Noy»)
date now; //yashirish initsiallashadi (nomlanadi.)
Konstruktorlarning uch turi mavjud.
Yashirin konstruktor paramyetrlarga ega emas. Agar sinf bitta ham konstruktorga ega bo‘lmasa, kompilyator avtomatik tarzda bitta yashirin konstruktor yaratadiki, u o‘z sinfiga mansub ob’yektni yaratishda xotirani shunchaki ajratib byeradi.
Date holatida har bir paramyetr uchun «yashirin qabul qilish: today» (bugun) sifatida talqin qilinadigan yashiringan qiymatni byerish mumkin.
class date {
int month, day, year;
public:
// ...
date(int d =0, int m =0, int y =0);
date(char*); // satr vositasida byerilgan sana
};
date::date(int d, int m, int y)
{
day = d ? d : today.day;
month = m ? m : today.month;
year = y ? y : today.year;
// yo‘l qo‘yiladigan sana ekanini tukshirish
// ...
}
Dalillarga ega konstruktor ob’yektning yaratilish paytida uni initsiallash (nomlash) ga, ya’ni turli funktsiyalarni chaqirib olishga, dinamik xotirani ajratish, o‘zgaruvchilarga dastlabki qiymatlarni byerish va h.k. ga imkon byeradi.
Nusha ko‘chirish konstruktori byerilgan sinf ob’yektlarini yaratish uchun ma’lumotlarni ushbu sinfning mavjud bo‘lgan boshqa ob’yektidan nusha ko‘chirish yo‘lidan borishga mo‘ljallangan. Bunday konstruktorlar ma’lumotlarning dinamik tuzilmalarini modyellashtiradigan ob’yektlar nushasini yaratishda ayniqsa maqsadga muvofiqdir. Biroq yashirin holda kompilyator yuzaki nushalash konstruktorlari (shallow copy constructors) dyeb ataluvchi faqat ma’lumotlar a’zolaridan nusha oladigan konstruktorlarni yaratadi. SHuning uchun, agar biron-bir ma’lumotlar a’zolari ko‘rsatkichlarga ega bo‘lsa, ma’lumotlarning o‘zidan nusha ko‘chirilmaydi. «CHuqur» nushalashni konstruktor kodiga joriy qilish uchun tyegishli yo‘riqnomalarni kiritish kyerak.
Misol:
class string
{
char *Str;
int size;
public:
string(string&); // nusxa ko‘chirish konstruktorlari
};
string::string(string& right) // dinamik o‘zgaruvchilar va rusurslar
{ // nusxalarini yaratadi
s = new char[right->size];
strcpy(Str,right->Str);
}
Do'stlaringiz bilan baham: |