Функция-мүшелер. Дерек-мүшелер. Кластардың элементтеріне жіберуді басқару

С ++-те әдісті кластың функция-мүшесі деп атау қабылданған, жариялауларды жіберу туралы деп кластың функция-мүшесін шақыру туралы сияқты айтылады.

• Функция-мүшелер - бұл кластың деректер-мүшелерімен манипуляция жасайтын

функция

• Функция-мүшелер өз класының барлық өрісіне кіре алады.

• Функция-мүшелер кластың жабық қорғалған және ашық бөлігінде болады

• Функция-мүшелер кластың ішкі немесе тыс (C++) жариялауында анықталуы мүмкін. Кластың тыс анықталған функция-мүшелер inlineжасалады.

• Функция-мүшелер олардан кейін жарияланған өрістерге немесе функция-мүшелерге қарайды.

• Функция-мүшелерде айқын емес жарияланған айнымалы this болады.

• Функция-мүшелер static болады. Бұндай функциялар кластың статикалық өрісіне тікелей кіріп өзгерте алады. Кластың статикалық функция-мүшелері const немесе virtual деп жариялай алмайды. Бұндай функцияларға объектінің нақты данасының атынан емес, кластың атынан ғана қарауға болады.

Листинг4.5.

Class Shape {

Static int num; point center; public:

shape (Point c): center (c) {++num;} ~Shape() {--num;}

Static int Num(){return num;} };

Int Shape::num=0; Void main()

{cout <<Shape ::Num(); //0 Shape s;

Cout <<Shape::Num();//1

for (int n=Shape::Num(); n>0; n--){}

}

• Функция-мүшелер constсияқты жарияланады, бұнда оларға шамасын

өзгертуге және кластың кез келген өрісіне константа емес сілтемені немесе нұсқауышты қайтаруға мүмкіндік жасамайды. Бұндай функция-мүшелер статикалық бола алмайды.

№7 лекция. Конструкторлар және деструкторлар: Жасау әдісі және инициализациялау. С++-тегі жасау әдісі жәнеинициализациялау. Конструкторлар. Конструкторлар және объектілердің массивтері

Конструкторы бар класс объектілерінің векторын сипаттау үшін бұл класта параметрдің тізімінсіз шақыратын конструктор болу керек. Үндемеу бойынша параметрлерді де қолдануға болмайды. Мысалы:

table tblvec[10];

егер параметрсіз конструктор жоқ болса, қате болады, өйткені table::table(int sz=10) үшін бүтін параметр қажет. Вектор сипаттамасында конструктордың параметрін беру эдісі жоқ. table кестесінің векторын сипаттау үшін table сипаттамасын модификация жасау керек, мысалы былай:

class table {    
void init (int sz) ; // ескі конструктор сияқты
public:        
table (int sz) { i n i t (s z ); } /*бұрынғыдай бірақ үндемеу бойынша емес*/
tabl e () { init (10); } //үндемеу бойынша
};        

Вектор жойылған кезде , деструктор осы вектордың әр элементі үшін шақырылады. new көмегімен орналаспаған векторлар үшін ол айқын емес жасалады. Бірақ-та бос жадыдағы векторлар үшін бұл айқын жасалмайды, себебі компилятор бір объектке бағытталған нұсқауышты объектілер векторының бірінші элементке бағытталған нұсқауышынан ажырата алмайды. Мысалы:

void f() {

table * t1 = new table; table * t2 = new table[10]; table * t3 = new table[10]; delete t1; // бір кесте

delete t2; // болмайды: 10 кестелер delete[] t3;

}

Компилятор белгіленген жадының ішінен вектордың элементтерінің санын таба алмайды, өйткені бос жадының таратушысы тілдің бөлігі болып табылмайды және оны программист береді.

Конструкторлар класс объектілерінің массивін тілінің ішінде құрылған типтердің массивтері сияқты инициаланады. Элементтерінің максимум саны, егер ол инициаланатыны шамалардың санына тең болса, түсіріледі. Егер элементтердің максимум саны шамалардың санынан көп болса, онда қалған шамалар үндемеу бойынша конструктордың көмегімен инициализациялайды. Егер бұл үндемеу бойынша конструктор емес болса, онда барлық шамалар көрсетілуі керек. Егер массивтің берілген мөлшері үшін барлық шамалар берілсе, онда фигуралық жақша шамалардың тізімін көрсеткенде түсіруі мүмкін.

class Phone { int a,b,c; public:

Phone(int al,int bl,int cl) :a(al) , b (bl) , с(cl) {} };

Phone office []={/*Компиляторөзімөлшердіесептейді*/

900, 800, 905, 6 7 8 , 4 5 6 , 5 4 6 };

Phone office [ 3 ] ={/*Үндемеу бойынша конструктор керек,олPhone-да жоқ*/

890, 790,343, 238, 279, 564 };

class int{

int *v, size, top; public:

int pop();

int Top() const; /*бірдемені өзгерте алмайды*/

};

Void а =s.Top(); /*Дұрыс: Top()константа мүшесі*/ Int b=s.Pop(); /*Қате: sмодификацияланбайды*/

}

class A{ int a; public:

A() {a=10; }

int & get() const; /*Қате сілтемені қайтарады*/}; int & A::get() const;{

return a;}

int main (int argc, char* argv[]){A b; cout << “ ” b.get();

return 0;

}

Наши рекомендации