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

В компьютере языки программирования, период, термин конструктор по умолчанию может относиться к конструктор который автоматически генерируется компилятором в отсутствие каких-либо конструкторов, определенных программистом (например, в Java), и обычно нулевой конструктор. В других языках (например, в C ++) это конструктор, который можно вызвать без необходимости предоставления каких-либо аргументов, независимо от того, является ли конструктор автоматически сгенерированным или определяемым пользователем. Обратите внимание, что конструктор с формальным параметры все еще можно вызывать без аргументов, если аргументы по умолчанию были предоставлены в определении конструктора.

C ++

В C ++, стандарт описывает конструктор по умолчанию для класса как конструктор который может быть вызван без аргументов (включая конструктор, все параметры которого имеют аргументы по умолчанию).[1] Например:

класс Мой класс{общественный:    Мой класс();  // объявлен конструкторчастный:    int Икс;};Мой класс::Мой класс() : Икс(100)  // конструктор определен{}int основной(){    Мой класс м;  // во время выполнения создается объект m, и вызывается конструктор по умолчанию}

При динамическом распределении памяти конструктор можно вызвать, добавив скобки после имени класса. В некотором смысле это явный вызов конструктора:

int основной(){    Мой класс * указатель = новый Мой класс();  // во время выполнения создается объект, и                                        // вызывается конструктор по умолчанию}

Если у конструктора есть один или несколько параметров, но все они имеют значения по умолчанию, то он по-прежнему является конструктором по умолчанию. Помните, что каждый класс может иметь не более одного конструктора по умолчанию, либо один без параметров, либо тот, все параметры которого имеют значения по умолчанию, например, в этом случае:

класс Мой класс{общественный:    Мой класс (int я = 0, стандартное::нить s = "");  // объявлен конструкторчастный:    int Икс;    int у;    стандартное::нить z;};Мой класс::Мой класс(int я, стандартное::нить s)     // конструктор определен{    Икс = 100;    у = я;    z = s;}

В C ++ конструкторы по умолчанию важны, потому что они автоматически вызываются при определенных обстоятельствах; и поэтому в этих обстоятельствах для класса будет ошибкой не иметь конструктора по умолчанию:

  • Когда значение объекта объявлено без списка аргументов (например: MyClass x;) или распределяется динамически без списка аргументов (например: новый MyClass; или новый MyClass ();), конструктор по умолчанию для Мой класс используется для инициализации объекта.
  • Когда объявляется массив объектов, например MyClass x [10];; или распределяется динамически, например новый MyClass [10]. Конструктор по умолчанию для Мой класс используется для инициализации всех элементов.
  • Когда конструктор производного класса не вызывает явно конструктор базового класса в своем списке инициализаторов, вызывается конструктор по умолчанию для базового класса.
  • Когда конструктор класса явно не вызывает конструктор одного из своих объектно-значных полей в своем списке инициализаторов, вызывается конструктор по умолчанию для класса поля.
  • В стандартной библиотеке некоторые контейнеры «заполняют» значения с помощью конструктора по умолчанию, если значение не указано явно. Например. вектор (10); инициализирует вектор десятью элементами, которые заполняются сконструированным по умолчанию Мой класс объект.

Если у класса нет явно определенных конструкторов, компилятор неявно объявит и определит для него конструктор по умолчанию. Этот неявно определенный конструктор по умолчанию эквивалентен явно определенному конструктору с пустым телом. Например:[2]

класс Мой класс{    int Икс;  // без конструктора, поэтому компилятор создает (неявный) конструктор по умолчанию};int основной(){    Мой класс м;   // без ошибок во время выполнения: вызывается (неявный) конструктор по умолчанию}

Если конструкторы явно определены для класса, но все они не являются конструкторами по умолчанию, компилятор не будет неявно определять конструктор по умолчанию, что приведет к ситуации, когда класс не имеет конструктора по умолчанию. Это причина типичной ошибки, продемонстрированной на следующем примере.

класс Мой класс{общественный:    Мой класс (int у);  // объявление конструктора не по умолчаниючастный:    int Икс;};Мой класс::Мой класс (int у){    Икс = у;}int основной(){    Мой класс м(100);     // вызывается нестандартный конструктор    Мой класс * п;        // для объявлений указателей компилятору не нужно знать о конструкторах    п = новый Мой класс();  // ошибка при компиляции: нет конструктора по умолчанию    вернуть 0;}

Поскольку ни программист, ни компилятор не определили конструктор по умолчанию, создание объекта, на который указывает п приводит к ошибке.[3]

С другой стороны, в C ++ 11 можно явно создать конструктор по умолчанию:

класс Мой класс{общественный:    Мой класс () = по умолчанию;  // принудительно генерировать конструктор по умолчанию};

Или явно запрещены:

класс Мой класс{общественный:    Мой класс () = Удалить;  // предотвращаем создание конструктора по умолчанию};

Java и C #

В обоих Ява и C # "конструктор по умолчанию" относится к нулевой конструктор который автоматически создается компилятором, если для класса не определены конструкторы. Конструктор по умолчанию неявно вызывает нулевой конструктор суперкласса, а затем выполняет пустое тело. Все поля остаются с начальными значениями 0 (целые типы), 0,0 (типы с плавающей запятой), ложный (логический тип), или значение NULL (ссылочные типы). Конструктор, определяемый программистом, который не принимает параметров, также называется конструктором по умолчанию в C #, но не в Ява.[4][5]

Рекомендации

  1. ^ Стандарт C ++, ISO / IEC 14882: 1998, 12.1.5
    Стандарт C ++, ISO / IEC 14882: 2003, 12.1.5
  2. ^ Информатика: структурированный подход с использованием C ++, Бехруз А. Форузан и Ричард Ф. Гилберг
  3. ^ Информатика: структурированный подход с использованием C ++, Бехруз А. Форузан и Ричард Ф. Гилберг
  4. ^ Спецификация языка Java, 3-е издание, раздел 8.8.9, «Конструктор по умолчанию».
  5. ^ Использование конструкторов (Руководство по программированию на C #)