Օբյեկտներ և դասեր
Մինչև այս պահն արդեն շատ անգամներ անուղղակիորեն հիշատակել ենք դաս (class) և օբյեկտ (object) տերմինները։ Հիմա արդեն ժամանակն է ավելի հստակ սահմանել այդ հասկացությունները և ճշտել նրանց դերը C++ լեզվով ծրագրավորման գործընթացում։
Օբյեկտը հատկությունների (property) և վարքի (behaviour) համադրություն է։ Օրինակ, 3.14
-ը double
տիպի օբյեկտ է։ Նրա հատկությունը (կամ դրանցից մեկը) թվային մեծությունն է՝ բոլորիս կողմից շատ սիրված π թիվը։ Իսկ double
օբյեկտների համար որպես վարք կարող ենք նշել, օրինակ, տվյալների հոսքից կարդալու և գրելու հնարավորությունները։ Մեկ այլ օբյեկտի օրինակ է երկրաչափական վեկտորը։ Նրա հատկություններն են երկարությունը և ուղղությունը։ Որպես վարք կարող ենք նշել երկու վեկտորների գումարման հնարավորությունը, կամ վեկտորի՝ հաստատունով բազմապատկման հնարավորությունը։ Ավելի բարդ օբյեկտի օրինակ է կոմպյուտերային պրոցեսորը։ Նրա հատկություններից են արագագործությունը, ռեգիստրների քանակը, հրամանների բազմությունը և այլն։ Պրոցեսորի վարքի տարրեր են մեկ հրամանի կատարումը, հիշողության հետ աշխատանքը և այլն։
Բերված օրինակներն ընդհանրացնելով կարող ենք նկատել, որ մեզ շրջապատող աշխարհում օբյեկներ կարող են կոչվել բոլոր գոյականները, որոնց վարքն արտահայվում է բայերի միջոցով։ ???
Օբյեկտ հասկացության հետ է կապված օբյեկտներին կողմնորոշված ծրագրավորման հասկացությունը։ Նորից օրինակով փորձենք հասկանալ դրա էությունը։ Մի պահ հեռանանք ծրագրավորումից և դիտարկենք շինությունների կառուցման զարգացումը։ Որոշ ժամանակ առաջ շենքերը կառուցվում էին քարից. դրան կարող ենք անվանել «քարին կողմնորոշված շինարարություն»։ Հետո սկսեցին բազմահարկեր կառուցել պատրասի բլոկներից կամ պանելներից. դրան էլ կարող ենք անվանել «պանելներին կողմնորոշված շինարարություն»։ Հիմա արդեն ավելի հարմար ու շահավետ են դարձել բետոնե մոնոլիտ կառույցները. դա էլ կարող ենք կոչել «բետոնին կողմնորոշված մոնոլիտ շինարարություն»։ Նույնն է նաև ծրագրավորման մեջ. ասելով «օբյեկտներին կողմնորոշված ծրագրավորում», ուզում ենք ասել, որ ծրագրերի «կառուցման» հիմնական «շինանյութը» օբյեկտն է։ Ուզում ենք ասել նաև, որ ծրագրավորման մի որևէ խնդիր լուծելիս ծրագրավորողն իր մտքերը ձևակերպում է «օբյեկներին կողմնորոշված», իսկ ստեղծված ծրագրի վարքը մոդելավորվում է օբյեկտների փոխգործակցության միջոցով։ ??
Եթե պետք է գրենք օբյեկտներին կողմնորոշված ծրագրեր, այսինքն՝ մեր ծրագրերը պետք է կառուցենք օբյեկտների և դրանց փոխգործակցության հենքի վրա, ապա ծրագրավորման լեզուն, տվյալ դեպքում՝ C++ լեզուն, պետք է հնարավորություն տա նկարագրելու օբյեկտների դասեր։ C++ լեզվի class
կառուցվածքը հենց նախատեսված է օբյեկտների հատկությունների և վարքի համատեղ նկարագրության համար։ Ի միջի այլոց, հատկությունների և վարքի այսպիսի «փաթեթավորումը» կոչվում է ինկապսուլյացիա (encapsulation)։
Վերցնենք ամենապարզ մի օրինակ՝ կետը բևեռային կոորդինատական համակարգում։ Այն որոշվում է երկու հատկանիշներով․ շառավիղ, որը կետի հեռավորությունն է բևեռից և ազիմուտ, որը բևեռային առանցքի և շառավղի կազմած անկյունն է։ Այս երկու հատկությունները սովորաբար նշանակվում են համապատասխանաբար ρ և ϕ
տառերով։ Սահմանենք PolarPoint
դասը․
class PolarPoint {
private:
double rho; // շառավիղ
double phi; // ազիմուտ
public:
// կոնստրուկտոր
PolarPoint( double r, double p );
// հատկությունների ինտերֆեյս
double radius() const;
double azimuth() const;
// կետերի հեռավորություն
double distance( const PolarPoint& other );
};
private
և public
պիտակներով (ծառայողական բառեր են), դասի սահմանման մեջ առանձնացված են «սեփական» ― փակ և «ընդհանուր» ― բաց տիրույթները։ Սեփական տիրույթում սահմանված փոփոխականներն ու ֆունկցիաները, որոնք, ի դեպ, դասերի համատեքստում համապատասխանաբար կոչվում են անդամներ և մեթոդներ, տեսանելի են միայն դասի սահմանման մեջ։ Արտաքին աշխարհին տեսանելի են միայն այն անունները, որոնք սահմանված են public
տիրույթում։