Конструктор класса

Конструктор (англ.  constructor) – это метод класса, имя которого совпадает с именем класса. Конструктор вызывается автоматически после выделения памяти для переменной и обеспечивает инициализацию компонент – данных. Конструктор не имеет никакого типа (даже типа void) и не возвращает никакого значения в результате своей работы. Конструктор нельзя вызывать как обычную компонентную функцию в программе. Для класса может быть объявлено несколько конструкторов, различающихся числом и типами параметров. При этом даже если для объектного типа не определено ни одного конструктора, компилятор создает для него конструктор по умолчанию, не использующий параметров, а также конструктор копирования, необходимый в том случае, если переменная объектного типа передается в конструктор как аргумент. В этом случае создаваемый объект будет точной копией аргумента конструктора.

Конструктор по умолчанию (англ. default constructor), в объектно-ориентированных языках программирования — конструктор, который может быть вызван без аргументов.

Хотя конструкторы и предназначены для решения особо важных задач, они мало чем отличаются от обычных функций и могут быть перегружены. Для перегрузки конструктора класса достаточно просто объявить различные его формы. Одна из самых распространенных причин для перегрузки конструкторов заключается в необходимости предоставить возможность одним объектам инициализировать другие.

Ключевое слово explicit используется для создания явных конструкторов. Другое название - «неконвертирующиеся конструкторы» (nonconverting constructors). Ключевое слово explicit запрещает автоматическое создание конвертирующего конструктора.


Пример:

#include <iostream>

using namespace std;

class People {
int age;

public:
    People() { this->age = 35; }//конструктор по-умолчанию

    explicit People (int age) { this->age = age; } //конструктор с параметрами, неявное преобразование недоступно

    People (int age, bool woman) { //конструктор с параметрами
        if (woman == true)
            this->age = age-5;
        else this->age = age;
    }

};

int main (int argc, char *argv[])
{
    int age;
    cin >> age;
    People killer(); //создание объекта с помощью конструктора по-умолчанию
    People husband(age);
    People wife(age, true);
    //People postman = 40; - здесь будет ошибка, т.к. присутствует explicit

    return 0;
}