Барномасозӣ бо синфҳо

Печать

Забони C++ дар асоси ба забони С илова кардани якчанд навовариҳо сохта шудааст. Яке аз навовариҳои муҳимтарин ин сохтани синф (class, класс) ва истифодаи фаъолонаи он дар рафти эҷоди барнома мебошад. Синф ин ифодаи ягон объекти олами воқеӣ мебошад. Аз сохтор (structure) то синф як қадам аст, сохтор дар худ ҳамчун аъзо функсияро дарбар намегирад. Ва баръакс, синф монанд аст ба сохторе, ки дар ифодаи худ ҳамчун аъзо ягон функсияро низ дорад.

Сохтор - услубест барои нигоҳ доштани якчанд тағйирёбандаҳо зери як ном. Синф бошад зери як ном натанҳо тағйирёбандаҳо, балки якчанд функсияҳоро низ нигоҳ медорад. Ғояи асосии истифодаи синфҳо ин сохтани барномаҳои калон дар асоси пайваст кардани қисмҳои тому муштараки код аст. Синф бояд дар худ чунин функсияву тағйирёбандаҳоро дошта бошад, ки онҳо барои амал кардани синф кофӣ бошанд ва синф бояд, ки ба ягон чизи бегона зарурият надошта бошад. Албатта, зарурият ба маълумоти ибтидоӣ пайдо шуданаш мумкин аст, лекин кабули маълумоти ибтидоӣ набояд тағйирёбанда ё функсияи беруниро талаб кунад. Чунин хусусияти синфҳо аз нав истифода бурдани ҳамон як қисми кодро соддатар мекунад.

Тарзи сохтани синфҳо душвор нест. Якум, калимаи махсуси class ва номи синфро менависанд. Баъд, қафси фигуравӣ {-ро навиштан зарур аст. Пеш аз муайян кардани тағйирёбандаҳо, дараҷаи маҳдудияти тағйирёбандаҳоро (permission level) нишон додан зарур аст. Се дараҷаи маҳдудият мавҷуд аст: умумӣ (public), ҳифзшуда (protected), пӯшида (private). Тағйирёбанда ва функсияҳое, ки ҳамчун умумӣ эълон шудаанд аз дилхоҳ қисми барнома дастрас мебошанд. Тағйирёбанда ва функсияҳое, ки ҳамчун ҳифзшуда эълон шудаанд фақат аз дохили синф ва синфҳои фаръии он дастрас мебошанд. Тағйирёбанда ва функсияҳое, ки ҳамчун хусуси эълон шудаанд фақат аз дохили синф дастрас мебошанд ва ҳатто аз синфҳои фаръӣ (ворисӣ) онҳо дастнорасанд. Тарзи муайян кардани дараҷаи маҳдудият чунин аст: калимаи махсуси дараҷаи маҳдудиятро муайянкунанда (public, protected ё private) навишта мешавад ва баъд рамзи дунуқта ( : ). Сипас, тағйирёбандаҳои гуногун ва функсияҳо (одатан, фақат тимсоли функсияҳо) навишта мешаванд. Дар охир, қафси фигуравӣ } ва нуқтавергул ( ; ) навишта мешаванд. Яъне:

class ном {
private:
тағйирёбандаҳо_ва_функсияҳо;
protected:
тағйирёбандаҳо_ва_функсияҳо;
public:
тағйирёбандаҳо_ва_функсияҳо;
};

Синф ҳатман ду функсияро бояд дарбар гирад: конструктор (constuctor) ва деструктор (destructor). Тарзи эълони онҳо чунин аст, номи класс номи конструктор мешавад ва номи класс бо рамзи тилда дар пеши он номи деструктор мешавад. Масалан, агар номи класс CStudent бошад, номи функсия-конструктор низ CStudent ва номи функсия-деструктор ~CStudent мешаванд. Максади асоси аз мавҷуд будани конструктор ин ба тағйирёбандаҳо бахшидани қиматҳои аввала мебошад. Мақсади асосӣ аз мавҷуд будани деструктор ин кори синфро ба итмом расонидан мебошад, ба мисоли озод кардани хотираи ба тағйирёбандаҳо ҷудошуда, пӯшидани файлҳо ва ғайра. Функсия-конструктор як маротиба ҳангоми эълон намудани намояндаи синф иҷро карда мешавад. Функсия-деструктор як маротиба ҳангоми гум шудани зарурият ба намояндаи синф иҷро карда мешавад, яъне ҳангоми ба итмом расидани барнома ё ки функсияе, ки дар он намояндаи синф эълон шуда буд, ё ки ҳангоми озод кардани қисми хотираи ба намоянда ҷудошуда мебошад. Дар хотир нигоҳ доштан зарур аст, ки на конструктор ва на деструктор ягон қимат бознамегардонанд. Ин маънои онро дорад, ки кӯшиши бозгардонидани қимат аз ин функсияҳо хатогӣ аст.

Тарзи муайян кардани кори функсияи дар синф эълоншуда берун аз синф чунин аст. Аввал намуди қимати аз функсия бозгардонидашаванда навишта мешавад, баъд номи синф, дуто рамзи дунуқта, номи функсия ва аргументҳои он навишта мешаванд. Ва дар қафсҳои фигуравӣ кори функсия муайян карда мешавад:

намуд Синф::Функсия(Аргументхо) {
операторхо;
}

Ин рафтор ба компилятор мефаҳмонад, ки функсия аъзои синф аст.

Тариқи эълон кардани намояндаи синф ба эълони тағйирёбандаҳо монанд аст:

Синф Намоянда; 

Имконпазир аст, ки ишоракунак ба намояндаи синф сохта шавад. Барои ин, ба мисли пештара, номи синф, ситорача (*) ва номи ишоракунакро навиштан зарур аст:

Синф *Ишоракунак_ба_Намоянда; 

Албатта, ҷудо кардани хотира ба воситаи оператори new низ набояд аз хотир барояд. Ба монанди сохторҳо, барои бо аъзоҳои намояндаи класс кардан номи ишоракунак ва оператори -> истифода бурда мешаванд.

Як мисол меорем:

//namuna33.cpp
using namespace std;
#include <iostream>
class CSana {
public:
void inSana(int s=1900, int m=1, int r=1);
void inSol(int s=1900);
void inMoh(int m=1);
void inRuz(int r=1);
void outSana();
int outSol();
int outMoh();
int outRuz();
private:
int sol; // >=1900
int moh; // 1-12
int ruz; // 1-31
};
void CSana::inSana(int s, int m, int r) {
sol=(s>=1900)?s:1900;
moh=(m>=1 && m<=12)?m:1;
ruz=(r>=1 && r<=31)?r:1;
};
void CSana::inSol(int s) {
sol=(s>=1900)?s:1900;
}
void CSana::inMoh(int m) {
moh=(m>=1 && m<=12)?m:1;
}
void CSana::inRuz(int r) {
ruz=(r>=1 && r<=31)?r:1;
}
void CSana::outSana() {
cout<<(ruz<10?"0":"")<<ruz<<"."
<<(moh<10?"0":"")<<moh<<"."<<sol;
}
int CSana::outSol() {
return sol;
}
int CSana::outMoh() {
return moh;
}
int CSana::outRuz() {
return ruz;
}
int main() {
CSana p, *ps;
int s=1976, m=5, r=10;
p.inSol(1976);
p.inMoh(5);
p.inRuz(10);
ps=new CSana;
ps->inSana(s,m,r);
p.outSana();
cout<<endl;
cout<<ps->outRuz()<<"/"<<ps->outMoh()<<"/"<<ps->outSol()<<endl;
return 0;
}

Дар мисоли мо номи синф CSana аст ва p намояндаи ин синф ва ps ишоракунак ба намояндаи синфи CSana мебошанд.

САВОЛҲО БАРОИ МУСТАҲКАМКУНӢ
1. Тарзи муайян кардани синф чӣ гуна аст?
2. Синф ва сохторро муқоиса кунед.
3. Вазифаи конструктор ва деструкторро фаҳмонида диҳед.
4. Тарзи муайян кардани кори функсияи дар синф эълоншуда берун аз синф чӣ гуна аст?

Добавить комментарий


Защитный код
Обновить

Произведение «OFTOB.COM» публикуется на условиях лицензии Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Непортированная.