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

редактировать

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

C ++

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

class MyClass {public: MyClass (); // конструктор объявлен закрытым: 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 :: строка s = ""); // конструктор объявлен закрытым: int x; int y; std :: string z; }; MyClass :: MyClass (int i, std :: string s) // определен конструктор {x = 100; у = я; z = s; }

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

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

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

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

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

класс MyClass {общедоступный: 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; // принудительное создание конструктора по умолчанию};

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

class MyClass {public: MyClass () = delete; // предотвращаем создание конструктора по умолчанию};
Java и C #

Как в Java, так и в C #, «конструктор по умолчанию» относится к конструктору с нулевым значением, который создается автоматически компилятором, если для класса не определены конструкторы. Конструктор по умолчанию неявно вызывает нулевой конструктор суперкласса, а затем выполняет пустое тело. Для всех полей остается исходное значение 0 (целочисленные типы), 0,0 (типы с плавающей запятой), false(логическийтип) или null( ссылочные типы). Конструктор, определяемый программистом, который не принимает параметров, также называется конструктором по умолчанию в C #, но не в Java.

Ссылки
  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 #)
Последняя правка сделана 2021-05-17 11:19:19
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте