Кластың статикалық берілгендері Егер кластың берілгендер өрісі static қызметші сөзімен сипатталса, онда бұл өрістің мәні сол кластың барлық объектілері үшін бірдей болады. Кластың статикалық берілгендері барлық объектілер қандай да бірдей мәндерді бірлесе қолданғанда пайдалы.
Статикалық өріс өз мінездемесі бойынша статикалық айнымалыға ұқсас: ол класс ішіде ғана көрінеді, ал оның өмірінің уақыты бағдарламаның өмір сүру уақытымен сәйкес келеді. Бірде бір класс объектісі болмаса да, статикалық айнымалысынан өзгешелігі – кластың статикалық өріс бар болады. Кластың статикалық айнымалысын қолдану мысалын қарастырайық.
Берілген мезетте әр объекті өзі сияқты жадыда қанша объект бар екендігін білу қажет болсын. Бұл жағдайда класқа count есімді статикалық айнымалыны енгізіеміз. count айнымалысын барлық объектілір көре алады және олардың бәрі бірдей мәнді көреді.
// statdata. cpp
# include < iostream. h>
class foo
{ private:
static int count;
public:
foo ( )
{ count ++;}
int getcount ( )
{ return count; }
};
int foo : : count = 0; // count анықтамасы
int main( )
{ foo f1, f2, f3;
cout << ”Объект саны = “ < cout << “Объект саны = “ < cout << “Объект саны =” < return 0; }
f1, f2, f3 объектілері үшін main( ) функциясында конструктор үш рет шақырылады, count өрістерін инкременттеу де үш рет болады.
getcount ( ) әдісі count –ты қайтарады. Барлық жағдайда да бұл әдіс бір мәнді қайтарады.
Объект саны =3
Объект саны =3
Объект саны =3
Егер статикалық емес, автоматты count өрісін қолдансақ, онда конструктор әр объекті үшін бұл өрістің мәнін бірге арттырар еді.
Объект саны =1
Объект саны =1
Объект саны =1
Класс өрістерінің жеке-жеке жариялануы және анықталынуы Статикалық өрістерді анықтау жай өрістерді анықтау тәрізді жүргізілмейді. Жай өрістертер жарияланады, яғни компиляторға оның есімі және типі хабарланады, содан соң анықталады, яғни компилятор айнымалыға типіне сәйкес жадыдан орын бөледі. Осының бәрі жалғыз ғана сипаттаудың көмегімен жүргізіледі. Ал статикалық өрістер үшін көрсетілген әрекеттер екі оператордың көмегімен жүргізіледі. Өрісті жариялау кластың ішінде жүргізіледі, ал оны анықтау кластың сыртында орындалады.
Егер статикалық өрістің анықталуы кластың ішінде орналасса, онда класты анықтау оған жадыдан орын бөлуді көрсетпейді деген қағиданы бұзған боламыз. Сондықтан статикалық өрістің анықталуын кластың сыртында орналастыру арқылы бағдарлама орындалуын бастағанға дейін оған жадыдан бір рет қана орын бөлінеді.
Объект 2
Объект 1 Объект 3
Автоматты Автоматты Автоматты
өрістер өрістер өрістер
data1 data1 data1
data2 data2 data2
Статикалық өрістер
data3
data4
Статикалық өрістермен кең ауқымды айнымалырадың арасында ұқсастық бар. Статикалық өрістермен жұмыс істеу барысында компилятор тани алмайтын оңай қателіктер жіберуге болады. Егер стаикалық өріс класта жарияланып, бірақ анықталмаса компилятор ескерту хабарламасын бермейді. Байланыстырушы редакторы бұл қатені анықтағанша бағдарлама қатесіз деп есептелінеді. Байланыстырушы редактор «анықталмаған кең ауқымды айнымалыны қолдануға ұмтылу» деген хабарламаны шығарады.
Тұрақты әдістер Тұрақты әдістер кластың өрістерінің мәндерін өзгертпейді.
//constfu.cpp
class aClass
{ private: int alpha;
public: void nonFunc( )
{alpha=99;}
void conFunc ( ) const //қате
{alpha=99;}
};
Функцияны тұрақты ету үшін оның прототипінен кейін, бірақ денесінің алдында const қызметші сөзін жазу керек. Егер функцияның жариялануы және анықталынуы бөлек берілсе, онда const модификаторы екі рет жазылады. Тек кластың өрістерінің мәндерін оқитын әдістерді тұрақты әдістер ретінде қолдану тиімді.
Мысалы, Distance класының showdist() әдісін тұрақты ету керек. Сол сияқты engeset.cpp бағдарламасындағы add_dist() әдісі де берілгендердің мәндерін өзгертпеу керек. Егер функция аргументін сілтеме арқылы беріп, сонымен қатар оның мәнін өзгертпеу крек болса, онда аргументті тұрақты ету керек. Ол үшін add_dist() әдісінің d2 параметрі const модификаторымен сипатталған.
//engeconst.cpp
#include
class Distance
{private:
int feet
fleat inches;
public:
Distance ():feet (0), inches (0.0)
{}
Distance (intft,float in): feet (ft),
Inches (in)
{}
void getdist( )
{cout<>feet;
cout<> inches;
}
void showdist( ) const
{cout< Distance add_dist (const Distance &) const;
};
Distance Distance : : add_dist (const Distance &) const;
{ Distance temp;
// feet=0; ошибка
// d2.feet=0 ошибка
temp.inches = inches + d2.inches;
if (temp.inches >= 12.0)
{temp.inches — = 12.0;
temp.feet = 1;
}
temp.feet + = feet + d2.feet;
return temp;
}
int main ( )
Distance dist1, dist3;
Distance d2 (11, 6.25);
dist1.getdist ( );
dist3 = dist1.add_dist (dist2);
cout<< ” dist1=”; dist1. showdist ( );
cout<< ” dist2=”; dist2. showdist ( );
cout<< ” dist3=”; dist3. showdist ( );
cout << endl;
return 0;
}