В языках компьютерного программирования термин « конструктор по умолчанию» может относиться к конструктору, который автоматически генерируется компилятором при отсутствии каких-либо конструкторов, определенных программистом (например, в Java), и обычно является конструктором с нулевым значением . В других языках (например, в C ++) это конструктор, который может быть вызван без предоставления каких-либо аргументов, независимо от того, является ли конструктор автоматически сгенерированным или определяемым пользователем. Обратите внимание, что конструктор с формальными параметрами по- прежнему может быть вызван без аргументов, если аргументы по умолчанию были предоставлены в определении конструктора.
C ++
В C ++ стандарт описывает конструктор по умолчанию для класса как конструктор, который может быть вызван без аргументов (включая конструктор, все параметры которого имеют аргументы по умолчанию). [1] Например:
класс MyClass { общедоступный : MyClass (); // объявлен конструкторчастный : int x ; };MyClass :: MyClass () : x ( 100 ) // определен конструктор { }int main () { MyClass m ; // во время выполнения создается объект m и вызывается конструктор по умолчанию }
При динамическом распределении памяти конструктор можно вызвать, добавив скобки после имени класса. В некотором смысле это явный вызов конструктора:
int main () { MyClass * указатель = новый MyClass (); // во время выполнения создается объект и вызывается // конструктор по умолчанию }
Если у конструктора есть один или несколько параметров, но все они имеют значения по умолчанию, то он по-прежнему является конструктором по умолчанию. Помните, что каждый класс может иметь не более одного конструктора по умолчанию, либо один без параметров, либо тот, все параметры которого имеют значения по умолчанию, например, в этом случае:
класс MyClass { общедоступный : MyClass ( int я = 0 , std :: string 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];
; или распределяется динамически, напримерnew MyClass [10]
. Конструктор по умолчаниюMyClass
используется для инициализации всех элементов. - Когда конструктор производного класса не вызывает явно конструктор базового класса в своем списке инициализаторов, вызывается конструктор по умолчанию для базового класса.
- Когда конструктор класса явно не вызывает конструктор одного из своих объектно-значных полей в своем списке инициализаторов, вызывается конструктор по умолчанию для класса поля.
- В стандартной библиотеке некоторые контейнеры «заполняют» значения с помощью конструктора по умолчанию, если значение не указано явно. Например,
vector
инициализирует вектор десятью элементами, которые заполняются созданным по умолчанию(10); MyClass
объектом.
Если класс не имеет явно определенных конструкторов, компилятор неявно объявит и определит для него конструктор по умолчанию. Этот неявно определенный конструктор по умолчанию эквивалентен явно определенному конструктору с пустым телом. Например: [2]
класс MyClass { int x ; // без конструктора, поэтому компилятор создает (неявный) конструктор по умолчанию };int main () { MyClass m ; // без ошибок во время выполнения: вызывается (неявный) конструктор по умолчанию }
Если конструкторы явно определены для класса, но все они не являются конструкторами по умолчанию, компилятор не будет неявно определять конструктор по умолчанию, что приведет к ситуации, когда класс не имеет конструктора по умолчанию. Это причина типичной ошибки, продемонстрированной на следующем примере.
класс MyClass { общедоступный : MyClass ( int y ); // объявление конструктора не по умолчаниючастный : int x ; };MyClass :: MyClass ( int y ) { x = y ; }int main () { MyClass м ( 100 ); // конструктор, отличный от конструктора по умолчанию, называется MyClass * p ; // для объявлений указателей компилятору не нужно знать о конструкторах p = new MyClass (); // ошибка при компиляции: нет конструктора по умолчанию return 0 ; }
Поскольку ни программист, ни компилятор не определили конструктор по умолчанию, создание объекта, на который указывает p
объект, приводит к ошибке. [3]
С другой стороны, в C ++ 11 можно явно создать конструктор по умолчанию:
класс MyClass { общедоступный : MyClass () = по умолчанию ; // принудительное создание конструктора по умолчанию };
Или явно запрещены:
класс MyClass { общественности : MyClass () = удалить ; // предотвращаем создание конструктора по умолчанию };
Java и C #
И в Java, и в C # «конструктор по умолчанию» относится к конструктору с нулевым значением, который автоматически генерируется компилятором, если для класса не определены конструкторы. Конструктор по умолчанию неявно вызывает нулевой конструктор суперкласса, а затем выполняет пустое тело. Все поля остаются с начальным значением 0 (целочисленные типы), 0,0 (типы с плавающей запятой), false
( boolean
тип) или null
(ссылочные типы). Конструктор, определяемый программистом, который не принимает параметров, также называется конструктором по умолчанию в C # , но не в Java . [4] [5]
Рекомендации
- ^ Стандарт C ++, ISO / IEC 14882: 1998, 12.1.5
Стандарт C ++, ISO / IEC 14882: 2003, 12.1.5 - ^ Компьютерные науки Структурированный подход с использованием C ++ Бехруз А. Форузан и Ричард Ф. Гилберг
- ^ Компьютерные науки Структурированный подход с использованием C ++ Бехруз А. Форузан и Ричард Ф. Гилберг
- ^ Спецификация языка Java, 3-е издание, раздел 8.8.9 , «Конструктор по умолчанию».
- ^ Использование конструкторов (Руководство по программированию на C #)