Из Википедии, бесплатной энциклопедии
  (Перенаправлено из Конструктора (информатика) )
Перейти к навигации Перейти к поиску

В классе на основе объектно-ориентированного программирования , конструктор (аббревиатура: т е р ) представляет собой особый тип подпрограммы призваны создать объект . Он подготавливает новый объект к использованию, часто принимая аргументы, которые конструктор использует для установки требуемых переменных-членов .

Конструктор похож на метод экземпляра , но отличается от метода тем, что у него нет явного возвращаемого типа , он не наследуется неявно и обычно имеет другие правила для модификаторов области видимости. Конструкторы часто имеют то же имя, что и объявленный класс . У них есть задача инициализировать элементы данных объекта и установить инвариант класса , но это не удается, если инвариант недействителен. Правильно написанный конструктор оставляет результирующий объект в допустимом состоянии. Неизменяемые объекты должны быть инициализированы в конструкторе.

Большинство языков допускают перегрузку конструктора, поскольку для класса может быть несколько конструкторов с разными параметрами. Некоторые языки принимают во внимание некоторые особые типы конструкторов. Конструкторы, которые конкретно используют один класс для создания объектов и возврата нового экземпляра класса, абстрагируются фабриками , которые также создают объекты, но могут делать это различными способами, используя несколько классов или разные схемы распределения, такие как пул объектов .

Типы [ править ]

Параметризованные конструкторы [ править ]

Конструкторы, которые могут принимать хотя бы один аргумент, называются параметризованными конструкторами. Когда объект объявляется в параметризованном конструкторе, начальные значения должны быть переданы в качестве аргументов функции конструктора. Обычный способ объявления объекта может не работать. Конструкторы можно вызывать явно или неявно. Метод неявного вызова конструктора также называется сокращенным методом. Если мы хотим инициализировать поля класса вашими собственными значениями, используйте параметризованный конструктор.

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  <iostream>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 [ править ]

В Java конструкторы отличаются от других методов тем, что:

  • Конструкторы никогда не имеют явного возвращаемого типа.
  • Конструкторы не могут быть вызваны напрямую (их вызывает ключевое слово « new»).
  • У конструкторов не должно быть модификаторов, запрещающих доступ.

Конструкторы Java выполняют следующие задачи в следующем порядке:

  1. Вызовите конструктор суперкласса по умолчанию, если конструктор не определен.
  2. Инициализируйте переменные-члены указанными значениями.
  3. Выполняет тело конструктора.

Java разрешает пользователям вызывать один конструктор в другом конструкторе с помощью this()ключевого слова. Но this()должно быть первое заявление. [3]

class  Example {  Example ()  // Непараметрический конструктор  {  this ( 1 );  // Вызов конструктора  System . из . println ( "0 аргументов против" );  }  Пример ( int  a )  // Параметризованный конструктор  {  System . из . println ( "1 аргумент" );  } } public  static  void  main ( String []  args ) { Пример  e  =  новый  пример (); }

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, который возвращает# истина, если установлен возраст 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 = Человек . новый (: первое имя <светлость> ,: последнее имя <Hopper> );

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

мое  $ 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 . новый Привет, там => # <ExampleClass: 0x007fb3f4299118>

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))

Заметки [ править ]

  1. ^ Подпрограммы Eiffel- это либо процедуры, либо функции . У процедур никогда не бывает возвращаемого типа. Функции всегда имеют возвращаемый тип.
  2. ^ Поскольку должен быть удовлетворен инвариант унаследованного класса, обязательного вызова конструкторов родителей нет.
  3. ^ Стандарт Eiffel требует инициализации полей при первом доступе, поэтому нет необходимости выполнять инициализацию поля по умолчанию во время создания объекта.

Ссылки [ править ]

  1. ^ a b c Конструкторы и деструкторы , из онлайн-документации PHP
  2. ^ Модель данных , из онлайн-документации Python
  3. ^ Подробная информация о конструкторе в java
  4. ^ «Предоставление конструкторов для ваших классов» . Корпорация Oracle. 2013 . Проверено 20 декабря 2013 .
  5. ^ «Сказочные приключения в кодировании» . Эрик Липперт. 2013-02-06 . Проверено 5 апреля 2014 .
  6. ^ Эксперт .NET 2.0 IL Assembler . АПресс. 2006-01-01. ISBN 9781430202233. Проверено 5 апреля 2014 .
  7. ^ Статический конструктор на C # в MSDN
  8. ^ https://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order Конструктор
  9. ^ Документ спецификации Eiffel ISO / ECMA
  10. ^ CFComponent
  11. ^ Модель данных
  12. ^ Модель данных
  13. ^ Руководство по OCaml