Կառուցիչներ և փլուզիչներ (Constructors and destructors)

Սովորաբար, օբյեկտի ստեղծման ժամանակ, անհրաժեշտ է լինում
սկզբնարժեքավորել փոփոխականներ կամ էլ հատկացնել դիմանիկ հիշողություն,
որպեսզի կանխել անորոշ արժեքների վերադարձի դեպքը: Օրինակ, ինչ
կկատարվի նախորդ ծրագրում, եթե մենք կանչենք area() ֆունկցիան, առանց
նախորոք կանչելու set_values() ֆունկցիան: Հավանական է, որ կվերադարձվի
անորոշ արժեք, քանի որ x և y անդամներին երբեք չեն վերագրվել որևէ արժեքներ:
Սա կանխելու նպատակով, կլասը կարող է պարունակել հատուկ ֆունկցիա`
կառուցիչ: Կառուցիչ ֆունկցիա հայտարարելու համար, ուղղակի պետք է անվանել
անդամ ֆունկցիան կլասի անունով: Այս ֆունկցիան ավտոմատ կանչվելու է տվյալ
կլասի նոր օբյեկտներ ստեղծելուց:
Օրինակ.

// klaseri orinak
#include
class CRectangle {
int width, height;
public:
CRectangle (int,int);
int area (void) {return (width*height);}
};
CRectangle::CRectangle (int a, int b) {
width = a;
height = b;
}
int main () {
CRectangle rect (3,4);
CRectangle rectb (5,6);
cout << "rect area: " << rect.area() << endl; cout << "rectb area: " << rectb.area() << endl; } rect area: 12 rectb area: 30 Իչպես տեսնում եք, այս ծրագրի արդյունքը նույնն է, ինչ նախորդինը: Այս օրինակում, մենք միայն փոխարինեցինք set_values ֆունկցիան կլասի կառուցիչով: Ուշադրություն դարձրեք, թե ինչպես են փոխանցվում պարամետրները կառուցիչին` նոր օբյեկտների ստեղծման ժամանակ. CRectangle rect (3,4); CRectangle rectb (5,6); Դուք նաև կարող եք տեսնել, որ ոչ կլասում՝ կառուցիչի նկարագրման մեջ, և ոչ էլ կառուցիչի որոշման մեջ, գրված չէ վերադարձվող արժեքի տիպը (նույնիս void չի գրված): Դա պետք է միշտ այդպես լինի: Կառուցիչը երբեք արժեք չի վերադարձնում, նույնիսկ void տիպի, ինչպես ցույց է տրված նախորդ օրինակում: Փլուզիչը կատարում է հակառակ գործողությունը: Այն ավտոմատ կանչվում է, երբ օբյեկտը ազատվում (ջնջվում) է հիշողությունից: Դա կամ օբյեկտի կյանքի տևողության ավարտի պատճառ է (օրինակ, եթե օբյեկտը հայտարարված էր, որպես լոկալ օբյեկտ ֆունկցիայի մեջ և ֆունկցիան ավարտվեց), կամ էլ, եթե այն դինամիկ վերագրված օբյեկտ էր և այն ազատվում է հիշողությունից` delete օպերատորի միջոցով: Փլուզիչը պետք է ունենա նույն անունը, ինչ կլասը, բայց որը սկսվում է ~ սիմվոլով, և պետք է ոչ մի արժեք չվերադարձնի: Փլուզիչները հաճախ օգտագործվում են այն դեպքերում, երբ օբյեկտը, ծրագրի ընթացքում, պահանջել է դինամիկ հիշողություն և որն էլ այժմ պիտի ազատվի: Օրինակ. // karucichneri ev pluzichneri orinak #include
class CRectangle {
int *width, *height;
public:
CRectangle (int,int);
~CRectangle ();
int area (void) {return (*width * *height);}
};
CRectangle::CRectangle (int a, int b) {
width = new int;
height = new int;
*width = a;
*height = b;
}
CRectangle::~CRectangle () {
delete width;
delete height;
}
int main () {
CRectangle rect (3,4), rectb (5,6);
cout << "rect area: " << rect.area() << endl;
cout << "rectb area: " << rectb.area() << endl;
return 0;
}
rect area: 12
rectb area: 30