stringtranslate.com

Конструктор (объектно-ориентированное программирование)

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

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

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

Типы

Параметризованные конструкторы

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

Пример класса { общественный : Пример (); Пример ( int a , int b ); // Параметризованный конструктор.          личное : int x_ ; интервал 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> класс Student { public : Student ( int a = 0 , int b = 0 ); // Конструктор по умолчанию.             инт а ; интервал б ; };   

Копировать конструкторы

Как и C++, Java также поддерживает «Конструктор копирования». Но, в отличие от C++, Java не создает конструктор копирования по умолчанию, если вы не пишете свой собственный. Конструкторы копирования определяют действия, выполняемые компилятором при копировании объектов класса. Конструктор копирования имеет один формальный параметр, который является типом класса (параметр может быть ссылкой на объект). Он используется для создания копии существующего объекта того же класса. Несмотря на то, что оба класса одинаковы, он считается конструктором преобразования. Хотя конструкторы копирования обычно обозначаются сокращенно copy ctor или cctor, они не имеют ничего общего с конструкторами классов, используемыми в .NET , использующими ту же аббревиатуру.

Конструкторы преобразования

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

Переместить конструкторы

В C++ конструкторы перемещения принимают ссылку Rvalue на объект класса и используются для реализации передачи владения ресурсами объекта параметра.

Синтаксис

Организация памяти

В Java, C# и VB .NET конструктор создает объекты ссылочного типа в специальной структуре памяти, называемой « кучей ». Типы значений (такие как int, double и т. д.) создаются в последовательной структуре, называемой « стеком ». VB .NET и C# также позволяют использовать оператор new для создания объектов типа значения, но эти объекты типа значения создаются в стеке независимо от того, используется оператор или нет.

В C++ объекты создаются в стеке, когда конструктор вызывается без оператора new, и создаются в куче, когда конструктор вызывается с оператором new. Объекты стека удаляются неявно, когда они выходят за пределы области видимости, тогда как объекты кучи должны быть удалены неявно с помощью деструктора или явно с помощью оператора удаления .

Подробности о языке

Конструкторы реализуются в разных языках программирования по-разному, в том числе:

С++

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

Конструктор состоит из двух частей. Сначала идет список инициализаторов , который следует за списком параметров и перед телом метода. Он начинается с двоеточия, а записи разделяются запятыми. Список инициализаторов не является обязательным, но дает возможность предоставить значения для членов данных и избежать отдельных операторов присваивания. Список инициализаторов необходим, если у вас есть элементы данных константного или ссылочного типа, а также элементы, которые не имеют логики конструктора без параметров. Присвоения происходят в соответствии с порядком объявления членов данных (даже если порядок в списке инициализаторов отличается). [3] Вторая часть — это тело, которое представляет собой тело обычного метода, заключенное в фигурные скобки.

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_ ; };    

Примеры вызовов:

Фубар а , б ( 3 ), с ( 5 , M_PI / 4 );    

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

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

С#

Пример конструктора C# :

общественный класс MyClass { частный int a ; частная строка b ;         // Конструктор public MyClass () : this ( 42 , "string" ) { }        // Перегрузка конструктора public MyClass ( int a , string b ) { this . а = а ; этот . б = б ; } }             
// Код где-нибудь // Создание экземпляра объекта с помощью конструктора над MyClass c = new MyClass ( 42 , "string" );     

Статический конструктор C#

В C# статический конструктор — это инициализатор статических данных. [4] : 111–112  Статические конструкторы также называются конструкторами классов . Поскольку фактический сгенерированный метод имеет имя .cctor, их часто также называют «cctors». [5] [6]

Статические конструкторы позволяют инициализировать сложную статическую переменную. [7] Статические конструкторы вызываются неявно при первом доступе к классу. Любой вызов класса (статический или вызов конструктора) запускает выполнение статического конструктора. Статические конструкторы являются потокобезопасными и реализуют шаблон Singleton . При использовании в универсальном классе программирования статические конструкторы вызываются при каждом новом универсальном экземпляре, по одному для каждого типа. [8] : 38  [4] : 111  Также создаются экземпляры статических переменных.

общественный класс MyClass { частный статический int _A ;       // Обычный конструктор static MyClass () { _A = 32 ; }        // Стандартный конструктор по умолчанию public MyClass () {    } }
// Код где-нибудь // Создание экземпляра объекта с помощью конструктора выше // прямо перед созданием экземпляра // Статический конструктор переменной выполняется, и _A равно 32 MyClass c = new MyClass ();    

Язык разметки ColdFusion (CFML)

Язык разметки ColdFusion (CFML) использует метод с именем ' init' в качестве метода конструктора.

Сыр.cfc

компонент { // свойства свойства name = "cheeseName" ;     // функция -конструктор Cheese init ( требуемая строка CheeseName ) { variables . сырное имя = аргументы . имя сыра ; вернуть это ; } }              

Создайте экземпляр сыра.

myCheese = новый сыр ( «Чеддер» );     

Начиная с ColdFusion 10, [9] CFML также поддерживает указание имени метода конструктора:

компонент initmethod = "Cheese" { // имя свойства свойства = "cheeseName" ;      // функция- конструктор Cheese Cheese ( требуемая строка CheeseName ) { variables . сырное имя = аргументы . имя сыра ; вернуть это ; } }              

Эйфелева

В Eiffel процедуры, инициализирующие новые объекты, называются процедурами создания . Процедуры создания имеют следующие особенности:

Хотя создание объекта включает в себя некоторые тонкости, [10] создание атрибута с типичным объявлением, x: Tвыраженным в инструкции создания, create x.makeсостоит из следующей последовательности шагов:

В первом фрагменте ниже 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_2POINT

В процедурном коде 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другими значениями.

 моя_точка_1 : ТОЧКА моя_точка_2 : ТОЧКА ...     создать my_point_1 создать my_point_2 . сделать ( 3.0 , 4.0 ) my_point_2 . сделать ( 5.0 , 8.0 ) ...         

Ф#

В 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 ) , затем printfn «Данный строковый параметр»         new () = MyClass ( 0 , "" ) , затем printfn "Параметр не задан" end      
// Код где-нибудь // создание экземпляра объекта с помощью основного конструктора let c1 = new MyClass ( 42 , "string" )     // создание экземпляра объекта с помощью дополнительных конструкторов let c2 = new MyClass ( 42 ) let c3 = new MyClass ( «строка» ) let c4 = MyClass () // ключевое слово «new» не является обязательным            

Джава

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

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

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

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

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

Java предоставляет доступ к конструктору суперкласса через superключевое слово.

public class Пример { // Определение конструктора. публичный пример () { this ( 1 ); }         // Перегрузка конструктора public Пример ( int input ) { data = input ; // Это присваивание }          // Объявление переменных экземпляра. частные данные int ; }   
// Код где-то еще // Создание экземпляра объекта с помощью приведенного выше конструктора Пример e = new Пример ( 42 );    

Конструктор, принимающий нулевое количество аргументов, называется конструктором «без аргументов» или «без аргументов». [12]

JavaScript

Начиная с ES6, JavaScript имеет прямые конструкторы, как и многие другие языки программирования. Они так и пишутся

класс FooBar { конструктор ( баз ) { this . баз = баз } }        

Это можно создать как таковой

const foo = новый FooBar ( '7' )    

Эквивалентом этого до ES6 было создание функции, которая создает экземпляр объекта как такового.

функция FooBar ( баз ) { this . баз = баз ; }      

Это создается так же, как указано выше.

Объектный Паскаль

В Object Pascal конструктор аналогичен фабричному методу . Единственное синтаксическое отличие от обычных методов — это ключевое слово constructorперед именем (вместо procedureили function). Он может иметь любое имя, хотя по соглашению в качестве префикса должен быть указан Createпрефикс, например, в CreateWithFormatting. Создание экземпляра класса работает аналогично вызову статического метода класса: TPerson.Create('Peter').

программа ОопПрограмма ; тип TPerson = частный класс FName : строка ; Имя публичного свойства : строка читается FName ; конструктор Create ( AName : string ) ; конец ;                конструктор TPerson . Создать ( AName : строка ) ; начало FName := AName ; конец ;     вар Человек : TPerson ; начать Человек := TPerson . Создать ( «Питер» ) ; // выделяет экземпляр TPerson и затем вызывает TPerson.Create с параметром AName = 'Peter' end .      

OCaml

В OCaml есть один конструктор. Параметры определяются сразу после имени класса. Их можно использовать для инициализации переменных экземпляра, и они доступны во всем классе. Анонимный скрытый метод initializerпозволяет оценить выражение сразу после создания объекта. [13]

класс  person  первое_имя  последнее_имя  =  значение объекта  полное_имя  = первое_имя ^ " " ^ последнее_имя       инициализатор  print_endline ( "Привет, я "  ^  полное_имя  ^  "." ) метод  get_last_name  =  Last_name  end ;;let  alonzo  =  новый  человек  «Алонзо»  «Церковь»  в  (*Привет, я Алонзо Чёрч.*)print_endline  alonzo # get_last_name  (*Церковь*)

PHP

В PHP версии 5 и выше конструктором является метод с именем __construct()(обратите внимание, что это двойное подчеркивание), который ключевое слово newавтоматически вызывает после создания объекта. Обычно он используется для автоматического выполнения инициализации, например инициализации свойств. Конструкторы также могут принимать аргументы, и в этом случае при newнаписании оператора вам также необходимо отправить аргументы конструктора для параметров. [1]

класс  Person {  частная  строка  $name ; общественная  функция  __construct ( строка  $name ) :  void  {  $this -> name  =  $name ;  } общественная  функция  getName () :  строка  {  return  $this -> name ;  } }

В PHP классу разрешено объявлять не более одного метода-конструктора. Статические методы, фабричные классы или дополнительные аргументы конструктора — это некоторые способы упростить создание объектов класса PHP.

Перл 5

В Perl версии 5 по умолчанию конструкторы являются фабричными методами , то есть методами, которые создают и возвращают объект, что конкретно означает создание и возврат благословенной ссылки. Типичный объект — это ссылка на хэш, хотя ссылки на другие типы используются редко. По соглашению единственный конструктор называется new , хотя разрешено называть его иначе или иметь несколько конструкторов. Например, класс Person может иметь конструктор с именем new и конструктор new_from_file , который считывает файл для атрибутов Person, и new_from_person , который использует другой объект Person в качестве шаблона.

пакет Человек ; # В Perl конструкторы по соглашению называются «новыми». sub new { # Имя класса неявно передается в качестве 0-го аргумента. мой $класс = сдвиг ;         # Значения атрибутов по умолчанию, если они у вас есть. мои %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 ; вернуть $self ; } 1 ;     

Perl 5 с Moose

В объектной системе Moose для Perl большую часть этого шаблона можно опустить, создать новый объект по умолчанию , можно указать атрибуты, а также указать, можно ли их устанавливать, сбрасывать или требовать. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD , который будет вызывать конструктор, сгенерированный Moose, после проверки аргументов. Можно указать метод BUILDARGS для обработки аргументов конструктора не в форме hashref/key => value .

пакет Человек ; # включить построение объектов в стиле Moose use Moose ;  # имя (строка) может быть установлено только во время создания ('ro') имеет first_name => ( is => 'ro' , isa => 'Str' , требуется => 1 ); # фамилия (строка) может быть установлена ​​только во время создания ('ro') имеет Last_name => ( is => 'ro' , isa => 'Str' , требуется => 1 ); # Возраст (Целое число) может быть изменен после создания ('rw'), и его не требуется # передавать в качестве конструктора. Также создает метод has_age, который возвращает # true, если установлен возраст, имеет age => ( is => 'rw' , isa => 'Int' , predicate => 'has_age' );                                 # Проверьте пользовательские требования sub BUILD { my $self = shift ; if ( $self -> has_age && $self -> age < 18 ) { # ни один человек младше 18 лет не умирает "Нет лиц младше 18 лет" ; } } 1 ;                 

В обоих случаях класс Person создается следующим образом:

используйте Person ; мой $p = Person -> new ( first_name => 'Sam' , Last_name => 'Ashe' , age => 42 );              

Питон

В Python конструкторы определяются одним или обоими методами __new__и __init__. Новый экземпляр создается путем вызова класса, как если бы это была функция, которая вызывает методы __new__и __init__. Если метод конструктора не определен в классе, будет вызван следующий метод, найденный в порядке разрешения методов класса . [14]

В типичном случае __init__необходимо определить только метод. (Наиболее распространенное исключение — неизменяемые объекты.)

>>> class  exampleClass : ...  def  __new__ ( cls ,  value ): ...  print ( "Создание нового экземпляра..." ) ...  # Вызов конструктора суперкласса для создания экземпляра. ...  экземпляр  =  супер ( ExampleClass ,  cls ) . __new__ ( cls ) ...  return  экземпляр ...  def  __init__ ( self ,  value ): ...  print ( "Инициализация экземпляра..." ) ...  self . полезная нагрузка  =  значение >>> exampleInstance  =  Примеркласс ( 42 ) Создание нового экземпляра... Инициализация экземпляра... >>> print ( exampleInstance . payload ) 42

Классы обычно действуют как фабрики для создания новых экземпляров самих себя, то есть класс представляет собой вызываемый объект (например, функцию), причем вызов является конструктором, а вызов класса возвращает экземпляр этого класса. Однако __new__методу разрешено возвращать что-то кроме экземпляра класса для специализированных целей. В этом случае метод __init__не вызывается. [15]

Раку

В Raku можно опустить еще больше шаблонов, учитывая, что по умолчанию наследуется новый метод, можно указать атрибуты, а также можно ли их устанавливать, сбрасывать или требовать. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD , который будет вызываться для обеспечения пользовательской инициализации. Можно указать метод TWEAK для постобработки любых уже (неявно) инициализированных атрибутов.

class  Person { has  Str  требуется $ .first-name ; # Имя (строка) может быть установлено только во время # создания (. означает "общедоступный"). имеет Str $.last - name требуется ; # Фамилия (строка) может быть установлена ​​только # во время создания (a ! будет означать "личное"). имеет Int $.age is rw ; # Возраст (целое число) может быть изменен # после создания ('rw') и не требуется # во время создания экземпляра объекта.                 # Создайте метод «полного имени», который возвращает полное имя человека.  # Доступ к этому методу возможен вне класса.  полное имя метода { $!first-name . tc ~ " " ~ $!фамилия . ТС } # Создайте метод has-age, который возвращает true, если возраст установлен.  # Этот метод используется только внутри класса, поэтому он объявляется как "частный"  # путем добавления к его имени символа !  метод  ! имеет возраст { self . возраст . определенный }  # Проверьте  метод  TWEAK { if  self ! has-age && $!age < 18 { # Нет лиц моложе 18 лет  die  "Нет лиц младше 18 лет" ; } }}

Класс Person создается следующим образом:

мой  $p0 = Человек . новый ( имя => 'Сэм' , фамилия => 'Эш' , возраст => 42 ); мой  $p1 = Человек . новый ( имя => 'благодать' , фамилия => 'хоппер' ); скажем  $p1 . полное имя (); # ВЫХОД: «Грейс Хоппер␤»

В качестве альтернативы именованные параметры можно указать с использованием синтаксиса пары двоеточий в Perl 6:

мой  $p0 = Человек . new ( : имя <Сэм> , : фамилия <Эш> , : возраст ( 42 ) ); мой  $p1 = Человек . новый (: имя <Грейс> ,: фамилия <Хоппер> );

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

мое  $first-name = "Сэм" ; my  $last-name = "Эш" ; мой  $age = 42 ; мой  $p0 = Человек . новый (: $имя ,: $фамилия ,: $возраст );

Рубин

В Ruby конструкторы создаются путем определения метода с именем initialize. Этот метод выполняется для инициализации каждого нового экземпляра.

irb(main):001:0> class exampleClass irb(main):002:1> def инициализировать irb(main):003:2> помещает "Привет" irb(main):004:2> end irb(main) :005:1> конец => nil irb(main):006:0> ПримерКласс . новый Привет => #<ExampleClass:0x007fb3f4299118>      

Визуальный Бейсик .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" )    

Смотрите также

Примечания

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

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

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