CPP-101: Класове и обекти

Конструктори

Член-променливите не могат да се инициализират при тяхната дефиниция. Причината за това е, че при дефинирането на класа не се създават екземпляри на член-променливите му. Това се случва едва когато се създаде обект от дефинирания клас. За всеки създаден обект се създават екземпляри на всички член-променливи на класа, които са свързани със създадения обект. Поради това инициализирането на член-променливите трябва да се извърши при създаване на обекти.

За инициализиране на член-променливите на обектите от даден клас се използва специализирана член-функция, която се нарича конструктор. При създаването на всеки обект се вика конструктор, който инициализира член-променливите на обекта. Извикването на конструктора се извършва автоматично при създаването на обект.

Името на конструктора съвпада с името на самия клас. Например, в следващия фрагмент е дефиниран клас Point. Конструкторът на този клас е деклариран в ред 4:

class Point {
    double x_,y_;
public:
    Point(double x, double y); // конструктор
    ...
};

Ако конструкторът има аргументи, то те трябва да се предадат при създаването на обекта. Например:

int main() {
    Point p1 = Point(1.0,1.0);
    Point p2(2.0,2.0);
    Point p3; // грешка
    Point p4(4.0); // грешка
    ...
}

Има възможност за един клас да се дефинират няколко конструктора, които се различават по аргументите, които им се предават.

В C++ е допустимо да се дефинират няколко функции с едно и също име, които се различават по броя и типа на аргументите. За да реши коя точно функция трябва се извика, компилаторът използва списъка на предадените аргументи (вж. раздел Предефиниране на функции).

Конструктор, който се извиква без аргументи се нарича конструктор по подразбиране. Например, в следващия фрагмент в ред 3 е деклариран конструктор, който се извиква с два аргумента, а в ред 4 – конструктор по подразбиране:

class Point {
public:
    Point(double x, double y);
    Point(void);
};

Кой конструктор ще се извика в даден конкретен случай се решава според аргументите, които са предадени при извикването на конструктора. Например, в следващия фрагмент, в ред 1 ще извика конструкторът на Point, който приема два аргумента, а в ред 2 ще се извика конструкторът по подразбиране (конструкторът без аргументи).

Point p1(1.0,1.0);
Point p2;
Публикувано в CPP-101, ООП с етикети , , . Постоянна връзка.