В классе на основе объектно-ориентированного программирования , конструктор (аббревиатура: т е р ) представляет собой особый тип подпрограммы призваны создать объект . Он подготавливает новый объект к использованию, часто принимая аргументы, которые конструктор использует для установки требуемых переменных-членов .
Конструктор похож на метод экземпляра , но отличается от метода тем, что у него нет явного возвращаемого типа , он не наследуется неявно и обычно имеет другие правила для модификаторов области видимости. Конструкторы часто имеют то же имя, что и объявленный класс . У них есть задача инициализировать элементы данных объекта и установить инвариант класса , но это не удается, если инвариант недействителен. Правильно написанный конструктор оставляет результирующий объект в допустимом состоянии. Неизменяемые объекты должны быть инициализированы в конструкторе.
Большинство языков допускают перегрузку конструктора, поскольку для класса может быть несколько конструкторов с разными параметрами. Некоторые языки принимают во внимание некоторые особые типы конструкторов. Конструкторы, которые конкретно используют один класс для создания объектов и возврата нового экземпляра класса, абстрагируются фабриками , которые также создают объекты, но могут делать это различными способами, используя несколько классов или разные схемы распределения, такие как пул объектов .
Типы
Параметризованные конструкторы
Конструкторы, которые могут принимать хотя бы один аргумент, называются параметризованными конструкторами. Когда объект объявляется в параметризованном конструкторе, начальные значения должны быть переданы в качестве аргументов функции конструктора. Обычный способ объявления объекта может не работать. Конструкторы можно вызывать явно или неявно. Метод неявного вызова конструктора также называется сокращенным методом. Если мы хотим инициализировать поля класса вашими собственными значениями, используйте параметризованный конструктор.
class Example { public : Example (); Пример ( int a , int b ); // Параметризованный конструктор. частный : int x_ ; int y_ ; };Пример :: Пример () = по умолчанию ;Пример :: Пример ( int x , int y ) : x_ ( x ), y_ ( y ) {}
Пример e = Пример ( 0 , 50 ); // Явный вызов. Пример e2 ( 0 , 50 ); // Неявный вызов.
Конструкторы по умолчанию
Если программист не предоставляет конструктор для экземпляра класса, компилятор Java вставляет конструктор по умолчанию в ваш код от вашего имени. Этот конструктор известен как конструктор по умолчанию. Вы не найдете его в исходном коде (файле java), поскольку он будет вставлен в код во время компиляции и существует в файле .class. Поведение конструктора по умолчанию зависит от языка. Он может инициализировать элементы данных нулевыми или другими одинаковыми значениями или вообще ничего не делать. В Java «конструктор по умолчанию» относится к конструктору с нулевым значением, который автоматически генерируется компилятором, если для класса не определены конструкторы или в отсутствие каких-либо конструкторов, определенных программистом (например, в Java конструктор по умолчанию неявно вызывает нулевого конструктора суперкласса, затем выполняет пустое тело). Для всех полей сохраняются начальные значения 0 (целочисленные типы), 0,0 (типы с плавающей запятой), false (логический тип) или null (ссылочные типы).
#include class Student { public : Student ( int a = 0 , int b = 0 ); // Конструктор по умолчанию. int a ; int b ; };
Копировать конструкторы
Как и C ++, Java также поддерживает «Конструктор копирования». Но, в отличие от C ++, Java не создает конструктор копирования по умолчанию, если вы не пишете свой собственный. Конструкторы копирования определяют действия, выполняемые компилятором при копировании объектов класса. У конструктора Copy есть один формальный параметр, который является типом класса (параметр может быть ссылкой на объект). Он используется для создания копии существующего объекта того же класса. Несмотря на то, что оба класса одинаковы, он считается конструктором преобразования. Хотя конструкторы копирования обычно сокращенно называются ctor или cctor, они не имеют ничего общего с конструкторами классов, используемыми в .NET, использующими то же сокращение.
Конструкторы преобразования
Конструкторы преобразования предоставляют компилятору средство неявно создавать объект, принадлежащий одному классу, на основе объекта другого типа. Эти конструкторы обычно вызываются неявно для преобразования аргументов или операндов в соответствующий тип, но они также могут вызываться явно.
Конструкторы перемещения
В C ++ конструкторы перемещения принимают ссылку на значение объекта класса и используются для реализации передачи владения ресурсами объекта параметра.
Синтаксис
- Java , C ++ , C # , ActionScript , PHP 4 и MATLAB имеют соглашение об именах, в котором конструкторы имеют то же имя, что и класс, с которым они связаны.
- В PHP 5 рекомендуемое имя конструктора -
__construct
. Для обратной совместимости будет вызываться метод с тем же именем, что и у класса, если__construct
метод не может быть найден. Начиная с PHP 5.3.3, это работает только для классов без пространства имен. [1] - В PHP 7 вы всегда должны называть конструктор как
__construct
. Методы с тем же именем, что и класс, вызовут ошибку уровня E_DEPRECATED. [1] - В Perl конструкторы по соглашению называются «новыми» и должны создавать изрядное количество объектов.
- В объектной системе Moose для Perl конструкторы (с именем new ) создаются автоматически и расширяются путем указания метода BUILD .
- В Visual Basic .NET конструктор называется "
New
". - В Python конструктор разделен на два метода: «
__new__
» и «__init__
».__new__
Метод отвечает за выделение памяти для экземпляра, и принимает класс в качестве аргумента (обычно называемого "cls
«).__init__
Метод (часто называемый «инициализатором») передается вновь созданный экземпляр в качестве аргумента (обычно называемого "self
«). [2] - Конструкторы Object Pascal обозначаются ключевым словом "
constructor
" и могут иметь пользовательские имена (но чаще всего называются "Create
"). - В Objective-C метод конструктора разделен на два метода, "
alloc
" и "init
", причемalloc
метод выделяет (выделяет) память для экземпляра класса, аinit
метод обрабатывает основную часть инициализации экземпляра. Вызов метода "new
" вызывает как методы, такalloc
иinit
методы для экземпляра класса.
Организация памяти
В Java, C # и VB .NET конструктор создает объекты ссылочного типа в специальной структуре памяти, называемой « кучей ». Типы значений (такие как int, double и т. Д.) Создаются в последовательной структуре, называемой « стеком ». VB .NET и C # также позволяют использовать новый оператор для создания объектов типа значения, но эти объекты типа значения создаются в стеке независимо от того, используется оператор или нет.
В C ++ объекты создаются в стеке, когда конструктор вызывается без оператора new, и создаются в куче, когда конструктор вызывается с оператором new. Объекты стека удаляются неявно, когда они выходят за пределы области видимости, в то время как объекты кучи должны быть удалены неявно с помощью деструктора или явно с помощью оператора удаления .
Сведения о языке
Ява
В Java конструкторы отличаются от других методов тем, что:
- Конструкторы никогда не имеют явного возвращаемого типа.
- Конструкторы не могут быть вызваны напрямую (их вызывает ключевое слово «
new
»). - У конструкторов не должно быть модификаторов, запрещающих доступ.
Конструкторы Java выполняют следующие задачи в следующем порядке:
- Вызовите конструктор суперкласса по умолчанию, если конструктор не определен.
- Инициализируйте переменные-члены указанными значениями.
- Выполняет тело конструктора.
Java разрешает пользователям вызывать один конструктор в другом конструкторе с помощью this()
ключевого слова. Но this()
должно быть первое заявление. [3]
class Example { Example () // Непараметрический конструктор { this ( 1 ); // Вызов конструктора System . из . println ( "0 аргументов против" ); } Пример ( int a ) // Параметризованный конструктор { System . из . println ( "1 аргумент" ); } } public static void main ( String [] args ) { Пример e = new Example (); }
Java предоставляет доступ к конструктору суперкласса через super
ключевое слово.
public class Example { // Определение конструктора. общедоступный Пример () { это ( 1 ); } // Перегрузка конструктора public Example ( int input ) { data = input ; // Это присвоение } // Объявление переменных экземпляра. частные данные типа int ; }
// Код в другом месте // Создание экземпляра объекта с помощью вышеуказанного конструктора Example e = new Example ( 42 );
Конструктор, принимающий нулевое количество аргументов, называется конструктором без аргументов или без аргументов. [4]
JavaScript
Начиная с ES6, в JavaScript есть прямые конструкторы, как и во многих других языках программирования. Они написаны как таковые
class FooBar { конструктор ( баз ) { это . baz = baz } }
Это может быть создано как таковое
const foo = новый FooBar ( '7' )
Эквивалентом этого до ES6 было создание функции, которая создает экземпляр объекта как такового.
function FooBar ( baz ) { this . baz = baz ; }
Это создается так же, как указано выше.
Visual Basic .NET
В Visual Basic .NET конструкторы используют объявление метода с именем « New
».
Класс Foobar Private strData как строка 'Конструктор Public Sub New ( ByVal someParam As String ) strData = someParam End Sub End Class
'код в другом месте ', создающий экземпляр объекта с помощью вышеуказанного конструктора Dim foo As New Foobar ( ".NET" )
C #
Пример конструктора C # :
открытый класс MyClass { частный int a ; частная строка b ; // Конструктор public MyClass () : this ( 42 , "строка" ) { } // Перегрузка конструктора public MyClass ( int a , string b ) { this . а = а ; это . б = б ; } }
// Код где-нибудь // Создание экземпляра объекта с помощью конструктора выше MyClass c = new MyClass ( 42 , "string" );
Статический конструктор C #
В C # , A статический конструктор является инициализатором статического данные. Статические конструкторы также называются конструкторами классов . Поскольку фактически сгенерированный метод имеет имя .cctor, их часто также называют "cctors". [5] [6]
Статические конструкторы позволяют инициализировать сложную статическую переменную. [7] Статические конструкторы вызываются неявно при первом обращении к классу. Любой вызов класса (статический вызов или вызов конструктора) запускает выполнение статического конструктора. Статические конструкторы являются потокобезопасными и реализуют одноэлементный шаблон . При использовании в универсальном классе программирования статические конструкторы вызываются при каждом новом создании универсального экземпляра, по одному для каждого типа. Также создаются статические переменные.
открытый класс MyClass { частный статический int _A ; // Обычный конструктор static MyClass () { _A = 32 ; } // Стандартный конструктор по умолчанию public MyClass () { } }
// Код где-нибудь // Создание экземпляра объекта с помощью конструктора выше // прямо перед созданием // Выполняется статический конструктор переменной и _A равно 32 MyClass c = new MyClass ();
C ++
В C ++ имя конструктора - это имя класса. Он ничего не возвращает. У него могут быть параметры, как у любой функции-члена . Функции конструктора обычно объявляются в общедоступном разделе, но также могут быть объявлены в защищенном и закрытом разделах, если пользователь хочет ограничить к ним доступ.
Конструктор состоит из двух частей. Сначала идет список инициализаторов, который следует за списком параметров и перед телом метода. Он начинается с двоеточия, а записи разделяются запятыми. Список инициализаторов не требуется, но дает возможность предоставлять значения для элементов данных и избегать отдельных операторов присваивания. Список инициализаторов требуется, если у вас есть элементы данных константного или ссылочного типа или члены, не имеющие логики конструктора без параметров. Назначения происходят в соответствии с порядком, в котором объявлены элементы данных (даже если порядок в списке инициализаторов отличается). [8] Вторая часть - это тело, которое представляет собой обычное тело метода, заключенное в фигурные скобки.
C ++ позволяет использовать более одного конструктора. Остальные конструкторы должны иметь другие параметры. Кроме того, конструкторы, которые содержат параметры, которым заданы значения по умолчанию, должны придерживаться ограничения, согласно которому не всем параметрам присваиваются значения по умолчанию. Это ситуация, которая имеет значение только при наличии конструктора по умолчанию. Конструктор базового класса (или базовых классов) также может вызываться производным классом. Функции-конструкторы не наследуются, и на их адреса нельзя ссылаться. Когда требуется выделение памяти, неявно вызываются операторы new и delete .
Конструктор копирования имеет параметр того же типа, который передается как ссылка на константу , например Vector (const Vector & rhs) . Если это не указано явно, компилятор использует конструктор копирования для каждой переменной-члена или просто копирует значения в случае примитивных типов. Реализация по умолчанию неэффективна, если класс имеет динамически выделяемые члены (или дескрипторы для других ресурсов), потому что это может привести к двойным вызовам удаления (или двойному освобождению ресурсов) после уничтожения.
class Foobar { public : Foobar ( double r = 1.0 , double alpha = 0.0 ) // Конструктор, параметры со значениями по умолчанию. : x_ ( r * cos ( alpha )) // <- Список инициализаторов { y_ = r * sin ( alpha ); // <- Нормальное присвоение } частный : двойной x_ ; двойной y_ ; };
Примеры вызовов:
Foobar a , b ( 3 ), c ( 5 , M_PI / 4 );
При возврате объектов из функций или передаче объектов по значению конструктор копирования объектов будет вызываться неявно, если не применяется оптимизация возвращаемого значения .
C ++ неявно генерирует конструктор копирования по умолчанию, который будет вызывать конструкторы копирования для всех базовых классов и всех переменных-членов, если только программист не предоставит его, явно удаляет конструктор копирования (для предотвращения клонирования) или один из базовых классов или конструктор копирования переменных-членов удаляется или недоступен (частный). В большинстве случаев, когда требуется настраиваемый конструктор копирования (например, подсчет ссылок , глубокая копия указателей), также требуется настройка деструктора и оператора присваивания копии . Это обычно называют Правилом трех .
F #
В F # конструктор может включать любые операторы let
или, do
определенные в классе. let
операторы определяют закрытые поля, а do
операторы выполняют код. Дополнительные конструкторы можно определить с помощью new
ключевого слова.
type MyClass (_ a : int , _ b : string ) = class // Первичный конструктор let a = _ a let b = _ b do printfn "a =% i, b =% s" a b // Дополнительные конструкторы new (_ a : int ) = MyClass (_ a , "" ) then printfn " Задан целочисленный параметр" new (_ b : string ) = MyClass ( 0 , _ b ) then printfn " Указан строковый параметр" new () = MyClass ( 0 , "" ) then printfn "Параметр не указан" end
// Код где-нибудь // создание экземпляра объекта с помощью основного конструктора let c1 = new MyClass ( 42 , "string" )// создание экземпляра объекта с дополнительными конструкторами let c2 = new MyClass ( 42 ) let c3 = new MyClass ( "string" ) let c4 = MyClass () // ключевое слово "new" необязательно
Эйфелева
В Eiffel процедуры инициализации новых объектов называются процедурами создания . Процедуры создания имеют следующие особенности:
- Процедуры создания не имеют явного возвращаемого типа (по определению процедуры ). [а]
- Названы процедуры создания.
- Процедуры создания обозначаются по имени как процедуры создания в тексте класса.
- Процедуры создания могут быть явно вызваны для повторной инициализации существующих объектов.
- Каждый эффективный (т.е. конкретный или не абстрактный) класс должен обозначать как минимум одну процедуру создания.
- Процедуры создания должны оставлять вновь инициализированный объект в состоянии, удовлетворяющем инварианту класса. [b]
Хотя создание объекта связано с некоторыми тонкостями, [9] создание атрибута с типичным объявлением, x: T
выраженным в инструкции создания, create x.make
состоит из следующей последовательности шагов:
- Создайте новый прямой экземпляр типа
T
. [c] - Выполните процедуру создания
make
для вновь созданного экземпляра. - Присоедините вновь инициализированный объект к сущности
x
.
В первом фрагменте ниже POINT
определен класс . Процедура make
кодируется после ключевого слова feature
.
Ключевое слово create
вводит список процедур, которые можно использовать для инициализации экземпляров. В этом случае список включает default_create
процедуру с пустой реализацией, унаследованной от класса ANY
, и make
процедуру, закодированную внутри класса.
класс POINT создать default_create , сделатьхарактерная черта make ( a_x_value : REAL ; a_y_value : REAL ) do x : = a_x_value y : = a_y_value end x : REAL - координата X y : REAL - координата Y ...
Во втором фрагменте класс, который является клиентом, POINT
имеет объявления my_point_1
и my_point_2
тип POINT
.
В процедурном коде my_point_1
создается как источник (0,0, 0,0). Поскольку процедура создания не указана, используется процедура, default_create
унаследованная от класса ANY
. Эта строка могла быть закодирована create my_point_1.default_create
. В инструкции с create
ключевым словом могут использоваться только процедуры, названные процедурами создания . Далее идет инструкция по созданию my_point_2
, предоставляющая начальные значения для my_point_2
координат. Третья инструкция выполняет обычный вызов экземпляра make
процедуры для повторной инициализации экземпляра, присоединенного к нему, my_point_2
с другими значениями.
my_point_1 : POINT my_point_2 : POINT ... создать my_point_1 создать my_point_2 . сделать ( 3.0 , 4.0 ) my_point_2 . make ( 5.0 , 8.0 ) ...
CFML
CFML использует метод с именем " init
" как метод конструктора.
Cheese.cfc
component { // свойства property name = "cheeseName" ; // функция конструктора Cheese init ( обязательная строка cheeseName ) { переменные . cheeseName = аргументы . cheeseName ; вернуть это ; } }
Создайте экземпляр сыра.
myCheese = новый сыр ( «Чеддер» );
Начиная с ColdFusion 10, [10] CFML также поддерживает указание имени метода конструктора:
компонент initmethod = "Cheese" { // свойства property name = "cheeseName" ; // функция- конструктор Cheese Cheese ( обязательная строка cheeseName ) { переменные . cheeseName = аргументы . cheeseName ; вернуть это ; } }
Object Pascal
В Object Pascal конструктор похож на фабричный метод . Единственное синтаксическое отличие от обычных методов - это ключевое слово constructor
перед именем (вместо procedure
или function
). Он может иметь любое имя, хотя по соглашению используется Create
префикс, например in CreateWithFormatting
. Создание экземпляра класса работает как вызов статического метода класса: TPerson.Create('Peter')
.
программа OopProgram ;тип TPerson = class private FName : string ; публичное свойство Name : чтение строки FName ; конструктор Create ( AName : string ) ; конец ; конструктор TPerson . Создать ( AName : строка ) ; begin FName : = AName ; конец ;var Person : TPerson ; begin Person : = TPerson . Создать ( 'Питер' ) ; // выделяет экземпляр TPerson, а затем вызывает TPerson.Create с параметром AName = 'Peter' end .
Perl 5
В языке программирования Perl версии 5 по умолчанию конструкторы являются фабричными методами , то есть методами, которые создают и возвращают объект, что конкретно означает создание и возврат благословенной ссылки. Типичный объект - это ссылка на хэш, хотя ссылки на другие типы также используются редко. По соглашению единственный конструктор называется новым , хотя ему разрешено называть его иначе или иметь несколько конструкторов. Например, класс Person может иметь конструктор с именем new, а также конструктор new_from_file, который считывает файл для атрибутов Person, и new_from_person, который использует другой объект Person в качестве шаблона.
пакет Person ; # В Perl конструкторы условно называются "новыми". sub new { # Имя класса неявно передается как 0-й аргумент. мой $ class = shift ; # Значения атрибутов по умолчанию, если они есть. мои % defaults = ( foo => "bar" ); # Инициализировать атрибуты как комбинацию значений по умолчанию и переданных аргументов. мой $ self = { % defaults , @_ }; # Проверить наличие обязательных аргументов, инварианта класса и т. Д. If ( не определено $ self -> { first_name } ) { die "Обязательный атрибут отсутствует в Person-> new (): first_name" ; } if ( не определено $ self -> { last_name } ) { die "Обязательный атрибут отсутствует в Person-> new (): last_name" ; } if ( определены $ self -> { age } и $ self -> { age } < 18 ) { die "Недопустимое значение атрибута в Person-> new (): age <18" ; } # Perl делает объект принадлежащим классу с помощью 'bless'. благослови $ self , $ class ; return $ self ; } 1 ;
Perl 5 с Moose
В объектной системе Moose для Perl большую часть этого шаблона можно исключить, создать новый по умолчанию , можно указать атрибуты, а также указать, могут ли они быть установлены, сброшены или являются обязательными. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD, который сгенерированный конструктор Moose вызовет после проверки аргументов. Можно указать метод BUILDARGS для обработки аргументов конструктора не в форме hashref / key => value.
пакет Person ; # разрешить создание объектов в стиле Moose use Moose ;# имя (строка) может быть установлено только во время построения ('ro') has first_name => ( is => 'ro' , isa => 'Str' , required => 1 ); # фамилия (строка) может быть установлена только во время построения ('ro') имеет last_name => ( is => 'ro' , isa => 'Str' , required => 1 ); # age (Integer) может быть изменен после построения ('rw') и не требуется # передавать в конструктор. Также создает метод has_age, который возвращает # true, если установлен age has age => ( is => 'rw' , isa => 'Int' , predicate => 'has_age' );# Проверить пользовательские требования sub BUILD { my $ self = shift ; если ( $ самостоятельно -> has_age && $ самостоятельно -> возраст < 18 ) { # не под 18s не умереть "Нет под 18 человек" ; } } 1 ;
В обоих случаях класс Person создается следующим образом:
используйте Person ; мой $ p = Человек -> новый ( first_name => 'Sam' , last_name => 'Ashe' , age => 42 );
Раку
С Ракой , еще более шаблонным может быть опущено, если учесть , что по умолчанию новый метод наследуется, атрибуты могут быть определены, а также могут ли они быть установлены, сброшены, или требуются. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD, который будет вызываться для обеспечения возможности индивидуальной инициализации. TWEAK , метод может быть определен , чтобы после процесса любые атрибуты уже (неявно) инициализируется.
Класс Person { имеет ул .first имя $ это требуется ; # Имя (строка) может быть установлено только # во время построения (. Означает "общедоступный"). имеет Str $ .last имя- это требуется ; # Фамилия (строка) может быть установлена только # во время создания (! Означает "частный"). имеет Int $ .age is rw ; # Возраст (целое число) может быть изменен после # построения ('rw') и не требуется # во время создания объекта. # Создайте метод 'full-name', который возвращает полное имя человека. # К этому методу можно получить доступ вне класса. метод full-name { $! first-name . tc ~ "" ~ $! фамилия . tc } # Создайте метод has-age, который возвращает true, если установлен age. # Этот метод используется только внутри класса, поэтому он объявлен как "частный" # путем добавления к его имени символа! метод ! has-age { self . возраст . определено } # Проверьте метод пользовательских требований TWEAK { if self ! has-age && $! age < 18 { # Нет моложе 18 die "Никто моложе 18 лет" ; } }}
Класс Person создается следующим образом:
мой $ p0 = Человек . новый ( first-name => 'Sam' , last-name => 'Ashe' , age => 42 );мой $ p1 = Человек . новый ( first-name => 'grace' , last-name => 'hopper' );скажите $ p1 . полное имя (); # ВЫХОД: «Грейс Хоппер»
В качестве альтернативы именованные параметры могут быть указаны с использованием синтаксиса пары двоеточий в Perl 6:
мой $ p0 = Человек . новый (: первое имя <Сэм> ,: последнее имя <Аш> ,: возраст ( 42 ));мой $ p1 = Человек . новый (: первое имя <светлость> ,: последнее имя );
И если вы установили переменные с именами, идентичными именованным параметрам, вы можете использовать ярлык, который будет использовать имя переменной для именованного параметра:
мое $ first-name = "Сэм" ;мой $ last-name = "Эш" ;мой $ age = 42 ;мой $ p0 = Человек . новое (: $ имя ,: $ фамилия ,: $ возраст );
PHP
В PHP версии 5 и выше конструктором является метод с именем __construct()
(обратите внимание, что это двойное подчеркивание), который ключевое слово new
автоматически вызывает после создания объекта. Обычно он используется для автоматического выполнения инициализации, такой как инициализация свойств. Конструкторы также могут принимать аргументы, и в этом случае, когда new
оператор написан, вам также необходимо отправить аргументы конструктора для параметров. [1]
class Person { частная строка $ name ; публичная функция __construct ( строка $ name ) : void { $ this -> name = $ name ; } публичная функция getName () : строка { return $ this -> name ; } }
Python
В Python , конструкторы определяются одним или обоими __new__
и __init__
методов. Новый экземпляр создается путем вызова класса , как если бы это была функция, которая вызывает __new__
и __init__
методы. Если метод конструктора не определен в классе, будет вызван следующий метод, найденный в порядке разрешения метода класса . [11]
В типичном случае __init__
необходимо определить только метод. (Наиболее частое исключение - неизменяемые объекты.)
>>> class ExampleClass : ... def __new__ ( cls , value ): ... print ( "Создание нового экземпляра ..." ) ... # Вызов конструктора суперкласса для создания экземпляра. ... экземпляр = супер ( ExampleClass , cls ) . __new__ ( cls ) ... вернуть экземпляр ... def __init__ ( self , value ): ... print ( "Инициализация экземпляра ..." ) ... self . Полезная нагрузка = значение >>> exampleInstance = ExampleClass ( 42 ) Создание нового экземпляра ... Инициирование экземпляр ... >>> печать ( exampleInstance . полезная нагрузка ) 42
Классы обычно действуют как фабрики для новых экземпляров самих себя, то есть класс - это вызываемый объект (например, функция), при этом вызов является конструктором, а вызов класса возвращает экземпляр этого класса. Однако __new__
методу разрешено возвращать что-то, кроме экземпляра класса для специализированных целей. В этом случае __init__
не вызывается. [12]
Рубин
В Ruby конструкторы создаются путем определения вызываемого метода initialize
. Этот метод выполняется для инициализации каждого нового экземпляра.
irb (main): 001: 0> class ExampleClass irb (main): 002: 1> def initialize irb (main): 003: 2> помещает "Hello there" irb (main): 004: 2> end irb (main) : 005: 1> end => nil irb (main): 006: 0> ExampleClass . новый Привет, там => #
OCaml
В OCaml есть один конструктор. Параметры определяются сразу после имени класса. Они могут использоваться для инициализации переменных экземпляра и доступны во всем классе. Вызываемый анонимный скрытый метод initializer
позволяет оценить выражение сразу после создания объекта. [13]
class person first_name last_name = объект val full_name = first_name ^ "" ^ last_name инициализатор print_endline ( "Здравствуйте, я" ^ full_name ^ "." ) метод get_last_name = last_name end ;;let alonzo = новый человек "Алонзо" "Церковь" в (* Здравствуйте, я - Алонзо Черч. *)print_endline alonzo # get_last_name (* Церковь *)
Смотрите также
- Размещение сайта
- Созидательный образец
- Деструктор
- Глобальный конструктор в C ++ и его аналог в C, атрибут функции ((constructor))
Заметки
- ^ Подпрограммы Eiffel- это либо процедуры, либо функции . У процедур никогда не бывает возвращаемого типа. Функции всегда имеют возвращаемый тип.
- ^ Поскольку должен быть удовлетворен инвариант унаследованного класса, обязательного вызова конструкторов родителей нет.
- ^ Стандарт Eiffel требует инициализации полей при первом доступе, поэтому нет необходимости выполнять инициализацию поля по умолчанию во время создания объекта.
Рекомендации
- ^ a b c Конструкторы и деструкторы , из онлайн-документации PHP
- ^ Модель данных , из онлайн-документации Python
- ^ Подробная информация о конструкторе в java
- ^ «Предоставление конструкторов для ваших классов» . Корпорация Oracle. 2013 . Проверено 20 декабря 2013 .
- ^ «Сказочные приключения в кодировании» . Эрик Липперт. 2013-02-06 . Проверено 5 апреля 2014 .
- ^ Эксперт .NET 2.0 IL Assembler . АПресс. 2006-01-01. ISBN 9781430202233. Проверено 5 апреля 2014 .
- ^ Статический конструктор на C # в MSDN
- ^ https://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order Конструктор
- ^ Документ спецификации Eiffel ISO / ECMA
- ^ CFComponent
- ^ Модель данных
- ^ Модель данных
- ^ Руководство по OCaml