Ванин, Сергей Сергеевич (конструктор)
- 1 year ago
- 0
- 0
Конструктор по умолчанию ( англ. default constructor ), в объектно-ориентированных языках программирования — конструктор , который может быть вызван без аргументов.
В C++ и Java , если нет явным образом определённых конструкторов в классе , то компилятор использует конструктор по умолчанию, определённый неявным способом, и обычно является конструктором, не имеющим аргументов (nullary constructor). Если программист явно указал только конструктор с параметрами, то компилятор не будет создавать конструктор по умолчанию.
В C++ и Java, если производный класс не вызывает явным образом конструктор базового класса (в C++ в списке инициализации, в Java используя
super()
в первой строчке), то конструктор по умолчанию вызывается неявно.
В C++ , стандарт описывает конструктор по умолчанию как конструктор, который может быть вызван без передачи аргументов (включая конструктор с параметрами, имеющими значение по умолчанию). Например:
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р:
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
приведёт также к ошибке.
С другой стороны, с C++11 конструктор по умолчанию может быть явно указан:
class MyClass
{
public:
MyClass () = default; // force generation of a default constructor
};
Или явно удалён:
class MyClass
{
public:
MyClass () = delete; // prevent generation of default constructor
};
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() );
}
} // Неверно!