Конструктор по умолчанию
Конструктор по умолчанию (англ. default constructor), в объектно-ориентированных языках программирования — конструктор, который может быть вызван без аргументов.
В C++ и Java, если нет явным образом определённых конструкторов в классе, то компилятор использует конструктор по умолчанию, определённый неявным способом, и обычно является конструктором, не имеющим аргументов (nullary constructor). Если программист явно указал только конструктор с параметрами, то компилятор не будет создавать конструктор по умолчанию.
В C++ и Java, если производный класс не вызывает явным образом конструктор базового класса (в C++ в списке инициализации, в Java используя super()
в первой строчке), то конструктор по умолчанию вызывается неявно.
C++
В C++, стандарт описывает конструктор по умолчанию как конструктор, который может быть вызван без передачи аргументов (включая конструктор с параметрами, имеющими значение по умолчанию).[1] Например:
class MyClass
{
public:
MyClass(); // конструктор описан
private:
int x;
};
MyClass :: MyClass() : x(100) // конструктор определён
{
}
int main()
{
MyClass m; // во время работы программы создаётся объект m И вызывается конструктор по умолчанию
}
Когда динамически выделяется память под объект, конструктор может быть вызван при помощи добавления пустых скобок после имени класса. В некотором смысле, это явный вызов конструктора:
int main()
{
MyClass * pointer = new MyClass(); // во время работы (рантайм) объект создаётся, и
// вызывается конструктор по умолчанию
}
Если у конструктора есть один или несколько параметров по умолчанию — это по прежнему конструктор по умолчанию. Каждый класс может иметь не более одного конструктора по умолчанию: либо без параметров, либо с параметрами, имеющими значения по умолчанию, как в этом примере:
class MyClass
{
public:
MyClass (int i = 0, std::string s = ""); // конструктор описан (прототип)
private:
int x;
int y;
std::string z;
};
MyClass :: MyClass(int i, std::string s) // конструктор определён
{
x = 100;
y = i;
z = s;
}
В C ++ конструкторы по умолчанию имеют существенное значение, поскольку они автоматически вызываются при определенных обстоятельствах, и, следовательно, при определённых условиях класс обязан иметь конструктор по умолчанию, иначе возникнет ошибка:
- Когда объект объявляется без аргументов (например,
MyClass x;
) или создаётся новый экземпляр в памяти (например,new MyClass;
илиnew MyClass();
). - Когда объявлен массив объектов, например,
MyClass x[10];
; или объявлен динамически, напримерnew MyClass [10]
. Конструктор по умолчанию инициализирует все элементы. - Когда в классе потомке не указан явно конструктор класса родителя в списке инициализации.
- Когда конструктор класса не вызывает явно конструктор хотя бы одного из своих полей-объектов в списке инициализации.
- В стандартной библиотеке определённые контейнеры заполняют свои значения используя конструкторы по умолчанию, если значение не указано явно. Например,
vector<MyClass>(10);
заполняет вектор десятью элементами, инициализированными конструктором по умолчанию.
Если в классе не определён конструктор по-умолчанию, компилятор неявно создаст его. Он будет аналогичен явно объявленному конструктору с пустым телом. Напримeр:[2]
class MyClass
{
int x;
};
int main()
{
MyClass m; // ошибки во время работы программы нет, вызывается неявный конструктор
}
Если определены конструкторы для класса, но среди них нет конструктора по умолчанию, компилятор не создаст неявно таковой. Это приводит к ошибкам, как в этом примере:
class MyClass
{
public:
MyClass (int y); // объявление конструктора не по умолчанию
private:
int x;
};
MyClass :: MyClass (int y)
{
x = y;
}
int main()
{
MyClass m(100); // вызывается конструктор не по умолчанию
MyClass * p; // при объявлении указателя компилятору не нужно знать о конструкторах
p = new MyClass(); // ошибка во время компиляции: нет конструктора по умолчанию
return 0;
}
Создание объекта на который указывает p
приведёт также к ошибке.[2]
С другой стороны, с C++11 конструктор по умолчанию может быть явно указан:
class MyClass
{
public:
MyClass () = default; // force generation of a default constructor
};
Или явно удалён:
class MyClass
{
public:
MyClass () = delete; // prevent generation of default constructor
};
Java
class DefaultConstructor {
int a = 10;
public int getInt() {
return a;
}
}
class Main {
public static void main(String[] args) {
DefaultConstructor Dc = new DefaultConstructor();//Конструктор по умолчанию
System.out.println( Dc.getInt() );
}
} // Неверно!
Примечания
- C++ standard, ISO/IEC 14882:1998, 12.1.5
C++ standard, ISO/IEC 14882:2003, 12.1.5 - Computer Science A Structured Approach Using C++ by Behrouz A. Forouzan and Richard F. Gilberg