Конструктор по умолчанию


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

В C++ и Java, если нет явным образом определённых конструкторов в классе, то компилятор использует конструктор по умолчанию, определённый неявным способом, и обычно является конструктором, не имеющим аргументов (nullary constructor). Если программист явно указал только конструктор с параметрами, то компилятор не будет создавать конструктор по умолчанию.

В C++ и Java, если производный класс не вызывает явным образом конструктор базового класса (в C++ в списке инициализации, в Java используя super() в первой строчке), то конструктор по умолчанию вызывается неявно.

C++

В 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 };

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() ); } } // Неверно!

  • Поплавко, Виктор Родионович
  • Ридель, Вальтер
  • Урмаев, Николай Андреевич
  • Баранов, Николай Иванович (конструктор)
  • Колчин, Василий Артёмович

  •  

    • Яндекс.Метрика
    • Индекс цитирования