Тұрақты объектілер const модификаторын объектілерге де қолдануға болады. Егер объект const модификаторымен сипатталса, онда оны өзгертуге болмайды. Мұндай объектілер үшін тек тұрақты әдістерді ғана шақыруға болады. Мысалы:
// constObj.cpp
# include
class Distance
{ private:
int feet
fleat inches;
public:
Distance (intft,float in): feet (ft), inches (in)
{}
void getdist ( )
{cout<>feet;
cout<> inches;
}
void showdist ( ) const
{cout << feet<< ” ’-“ << nches < ’ ” ’;}
}
int main( )
{const Distance football (300,0);
// football.getdist( ); — қате
cout<< ” Длина поля = ”; football.showdist( );
cout< return 0;
}
Американдық футбол алаңының ұзындығы 300 футқа тең. football объектісі — тұрақты объект. Сондықтан тек тұрақты әдістерді ғана шақыра аламыз.
Операцияларды асыра жүктеу Операцияларды асыра жүктеу — объектілі бағытталған бағдарламалаудың ең күрделі мүмкіндіктерінің бірі.
Жаңа кластарды құру және операцияларды асыра жүктеу С++ тілінің мүмкіншілігін кеңейтуге жол ашады. Жаңа кластар үшін операцияларды асыра жүктеу арқылы программистер жаңа өз тілін құра алады.
Унарлы операцияларды асыра жүктеу Унарлы операцияның тек бір ғана операндасы болады (операнд дегеніміз операция әрекет жасайтын айнымалы). Унарлы операцияның мысалы ретінде инкрементті, декрементті алуға болады. Алдыңғы тақырыптарда қарастырылған Counter класының с1 объектісі қосқышының мәнін 1-ге арттыру үшін с1.inc_count() әдісі шақырылған болатын. Программа мәтіні түсінікті болу үшін ++с1 жазуы ыңғайлы болар еді. Осы операцияны асыра жүктеу бағдарламасын қарастырайық.
// countpp1.cpp
# include
class Counter
{ private:
unsignet int count;
public:
Counter ( ) : count (0)
{}
unsigned int get_count(0)
{return count;}
void operator ++( )
{++count;}
};
int main ( )
{ Counter c1, c2;
cout << ” n c1 = “ < cout << ” n c2 = “ < ++c1;
++c2;
++c2;
cout << ” n c1 = “ < cout << ” n c2 = “ < count << endl;
return 0;
}
Жауабы: с1=0
с2=0
с1=1
с2=2
++ операциясын асыра жүктеу үшін operator қызметші сөзі қолданылған.
Алдымен қайтарылатын тип көрсетіледі (біздің жағдайда void типі), содан соң operator қызметші сөзі, кейін операция белгісі ++ және жақша ішінде көрсетілген аргументтер тізімі жазылады. Біздің жағдайда жақша іші бос. Бұл синтаксис компиляторға бағдарлама мәтінінде ++ операциясының операнды Counter класына тиісті болса осы функцияны шақыру керектігін көрсетеді.
Компилятор асыра жүктелген функцияларды берілгендер типтеріне және аргумент сандарына қарай ажыратады. Сол сияқты асыра жүктелген операцияларды операндалардың типтеріне қарай ажыратады.
Біздің жағдайда operator ++( ) функциясының аргументтері жоқ. Олай болса бұл операция нені өсіреді? Ол операцияны шақырып тұрған объектінің count өрісінің мәнін өсіреді. Класс әдістерінің өзін шақырып тұрған осы кластың объектісін көре алатындықтан операция үшін аргументтің қажеті жоқ.
countpp1.cpp бағдарламасындағы operator++() функциясының кішкене кемшілігі бар. Егер біз с1 = ++ с2; меншіктеу операторын жазсақ компилятор қате береді. Себебі operator ++() функциясы void типін қайтарады. Ал меншіктеу операторы Counter типін қайтаруын сұрайды. Яғни меншіктеу өрнектерінде operator ++() функциясын қолдану үшін қайтарылатын типті дұрыс анықтауымыз керек. Мысалы:
// countpp2.cpp
# include < iostream.h >
class Counter
{ private:
unsignet int count;
public:
Counter ( ) : count (0)
{}
unsigned int get_count(0)
{return 0;}
Counter operator ++( )
{++count;
Counter temp;
temp. count = count;
return temp;
}
};
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 ( );
count << endl;
return 0;
}
Программаның бұл мәтінінде operator ++() функциясында Counter класына тиісті жаңа объект анықталған. Объект алдымен өзінің count өрісінің мәні арттырады, содан соң temp объектісінің count өрісіне меншіктелініп, негізгі бағдарламаға қайтарылады. temp объектісін қолдану үшін бағдарлама мәтінінде 3 жол қажет болды. Осы әрекеттерді орындау үшін есімсіз объектіні қолданатын тағы бір әдіс бар.
// countpp3.cpp
# include
class Counter
{ private:
unsignet int count;
public:
Counter ( ) : count (0)
{}
Counter (int c) : count (c)
unsigned int get_count (0)
{return count;}
Counter operator ++( )
{++count;
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 ( );
count << endl;
return 0;
}
Программа мәтініндегі
return Counter (count);
жолы типі Counter есімсіз объект құрып негізгі бағдарламаға қайтарады. Бұл объект басқа еш жерде қолданылмайтындықтан объект есімсіз болып тұр. Объектінің мәні count параметрінің мәнімен анықталған. Көрсетілген жол дұрыс жұмыс істеу үшін бір аргументі бар конструктор алдын-ала анықталынуы керек.