Постфиксті операция Мәні қолданылып болғаннан кейін мәнін арттыратын постфиксті операция үшін асыра жүктеуді қалай орындау керек екендігін қарастырайық. ++ операциясын асыра жүктеудің екі әдісін келтірейік.
// postfix.cpp
# include < iostream.h >
class Counter
{ private:
unsignet int count;
public:
Counter ( ) : count (0)
{}
Counter (int c) : count (c)
unsigned int get_count (0)
{return count;}
Counter operator ++ ( )
{return Counter (++ count);}
}
Counter operator ++( int )
{return Counter (++count ++);
}
};
int main( )
{ Counter c1, c2;
cout << ” n c1 = “ << c1. get_count ( );
cout << ” n c2 = “ << c2. get_count ( );
++c1;
c2 = ++c1;
cout << ” n c1 = “ << c1. get_count ( );
cout << ” n c2 = “ << c2. get_count ( );
c2 = c1++
cout << ” n c1 = “ << c1. get_count ( );
cout << ” n c2 = “ << c2. get_count ( );
return 0;
}
Мысалда operator ++() функциясының екі түрі бар.
Counter operator ++ ( ) және
Counter operator ++ ( int )
Бұл жерде int аргумент ролін атқармайды. Компилятор үшін ++ операциясының постфиксті версиясын қолдану жөнінде белгі болып табылады. Программаның орындалу нәтижесінде келесі нәтижелерді аламыз:
с1=0
с2=0
с1=2
с2=2
с1=3
с2=2
Арифметикалық операциялар
Осы уақытқа дейін Distanse класының объектілерін қосу үшін add_dist() әдісі қолданылып келді:
dist3.add_dist(dist1, dist2);
+ операциясын асыра жүктеу арқылы келесі түрде жазуға болады:
dist 3 = dist1 + dist2;
// engplus. cpp
# include
class Distance
{ private:
int feet;
float inches;
public:
Distance ( ) : feet (0) , inches (0)
{ }
Distance ( int ft , float in ) : feet (ft) , inches ( in)
{ }
void getdist ( )
{ cout << ” n Футты енгізіңіз = “ ; cin >> feet;
cout << “ n Дюймді енгізіңіз = “; cin >> inches ;
}
void showdist ( )
{
cout << feet << ” ‘ – “ << inches << ‘ “ ‘;}
Distanse operator + ( Distanse ) const;
};
Distanse Distanse: : operator + ( Distanse d2) const;
{ int f = feet + d2. feet;
float i = inches + d2. inches;
if (i >= 12.0)
{ i — = 12.0
f ++;
}
return Distance(f, i);
int main ( )
{ Distance dist1, dist3, dist4;
dist1. getdist ( );
Distance dist2 (11, 6.25);
dist3 =dist1+ dist2;
dist 4 = dist1 + dist2+ dist3;
cout << ”dist1 = “; dist1. showdist ( ); cout << endl;
cout << ”dist2 = “; dist2. showdist ( ); cout << endl;
cout << ”dist3 = “; dist3. showdist ( ); cout < cout << ”dist4 = “; dist4. showdist ( ) ;cout << endl ;
return 0;
}
С++ тілінде страуктураның немесе класстың мүшесін алу операциясын (.), келісім беру операциясын (:: операция разрешения), шартты операцияны (?:), көрсеткіш бойынша берілгенді алу операциясын (->) асыра жүктеуге болмайды.
Мұрагерлік Мұрагерлік дегеніміз алдын-ала бар кластардан туынды кластарды құру. Алдын-ала бар класты негізгі (базалық) класс деп, ал мұрагер класты туынды класс деп атаймыз. Туынды класс негізгі кластың барлық мүмкіндіктерін қабылдаумен қатар, өзінің мүмкіндіктерінде дамыта алады. Бұл жағдайда негізгі класс өзгеріссіз қалады. Мұрагерлік бар кодты бірнеше рет қайталап қолдануа мүмкіндік береді. Туынды класты алу үшін класс есімімен кейін қос нүкте, содан соң public сөзінен кейін негізгі кластың есімі көрсетіледі. Біз кластың private және public бөліктерінің бар екендігін білеміз. Кластың ішінде рrivate бөліктердегі берілгендер мен әістерді көре аламыз. Ал сырттан тек public бөлігіндегі берілгендер мен функцияларды көруге болады.
Туынды кластар негізгі кластың private бөлігіндегі берілгендер мен функцияларды қолдана алмайды. Енді класқа қосымша тағы бір бөлік қосылады. Ол protected бөлігі. Бұл бөліктегі берілгендер мен функциялар туынды кластарға public бөліктегі берілгендер мен функциялар қоса көрінеді. Тек кластың ішінде ғана private бөліктегі берілгендер мен функцияларды көруге болады. Мысалы ,бағдарламада анықталған класс объектісі тек public бөліктегі берілгендер мен функцияларды қолдана алады.
# include
class Counter
{ protected:
unsigned int count;
pablic:
Counter ( ): count (0)
{}
Counter (int c ): count (0)
{}
unsigned int count ( )
{return count;}
Counter operator ++( )
{return Count (++count);}
};
class Count Dn: public Counter
{ public:
Counter operator — - ( )
{return Count (count — - );}
};
void main ( )
{ Count Dn c1;
cout << “ n c1=” << c1.get_count ( );
++c1;
cout << “ n c1=” << c1.get_count ( );
- — c1;
cout << “ n c1=” << c1.get_count ( );
}
CountDn класы Counter класының конструкторын қолдана алады, ал Count Dn класының объектілері үшін бұл жағдайда негізгі Counter класының бір аргументті конструкторын қолдануға болмайды. CountDn класы үшін конструкторды анықтаймыз:
class Count Dn: public Counter
{ public:
Count Dn ( ): Counter ( )
{}
Count Dn (int c): Counter (с )
{}
Count Dn operator — - ( )
{return Count (- — count );}
};
class А — класс әдістері өзінің ішіндегі private бөліктегі де, public бөліктегі берілгендерді көре алады;
тиым салынған, яғни А класының объектісі
private бөліктегі берілгендерді көре алмайды.
А класының объектісі тек public бөліктегі
берілгендерді ғана көре алады.
obj A
Енді мұрагерлік жағдайдағы көру спецификаторларын қарастырайық:
class В базалық класы
Туынды класс D
class D: public
obj B
obj D
Кластар иерархиясы Бір компанияның қызметкерлері жөнінде мәліметтер базасын құру керек болсын. Компаниядда қызметкерлердің үш категориясы жұмыс істесін, яғни менеджерлер, ғалымдар және жұмысшылар. Базада қызметкерлердің есімі және идентификциялық номерлері, сонымен қатар менеджерлер үшін олардың қызметінің есімі, гольф-клубқа төлейтін взностың нөмері, ғалымдар үшін олардың жарық көрген ғылыми еңбектер саны қажет болсын.
Бұл бағдарламаны құру үшін empogee базалық класын сипаттаудан бастаймыз. Класта қызметкердің фамилиясы және номері беріледі және оларды енгізу және шығару әдістері беріледі. Бұл кластан туынды manager, scientist және laborer кластары алынады. Олар қосымша ақпараттарды қабылдайды.
emplogee
- private
- public
manager scientist laborer
manager scientist laborer
foreman
foreman
Енді жұмысшылардың ішінде бригадир бар болатын болсын, онда туынды laborer класынан туынды foreman туынды класын аламыз. Бригадир жұмыс жоспарының орындалуын қадағаласын. Яғни туынды кластардан да туынды класты алуға болады.
#include
cons tint LEN=80;
class employee
{private:
char name[LEN];
unsigned long number;
public:
void getdata()
{cout<>name;
cout<>number;
}
void putdata() const
{cout< cout< }
};
class manager: public employee
{private:
char title[LEN];
double dues;
public:
void getdata()
{
empoyee::getdata();
cout<>title;
cout<>dues;
}
void putdata()
{
employee::putdata();
cout< cout< }
};
class scientist: public employee
{private:
int pubs;
public:
void getdata()
{
employee::getdata();
cout<>pubs;
}
void putdata()
{
employee::putdata();
cout< }
};
class laborer: public employee
{
};
class foreman: public laborer
{private:
float quotas;
public:
void getdata()
{
laborer::getdata();
cout<>quotas;
}
void putdata()
{
laborer::putdata();
cout< }};
int main()
{laborer l1;
foreman f1;
cout< l1.getdata();
cout< f1.getdata();
cout<<< l1.putdata();
cout< f1.putdata();
cout< return 0;
}
Кластың әдістерін алуды реттеп отыруға болады. Оның бірі туынды кластарды анықтау барысында. Осы уақытқа дейін туынды класты public сөзінің көмегімен алдық. Яғни туынды кластың объектілері базаық кластың public бөлігіндегі берілгендерді көре алады. Енді private сөзінің көмегімен де туынды кластарды анықтауға болады. Бұл жағдайда туынды кластың объектілері, базалық кластың public бөлігіндегі берілгендерді ала алмайды.