Конструктор (объектно-ориентированное программирование)
В классов на основе объектно-ориентированном программировании конструктор вызываемый (аббревиатура: ctor ) — это особый тип функции, для создания объекта . Он подготавливает новый объект к использованию, часто принимая аргументы , которые конструктор использует для установки необходимых переменных-членов .
Конструктор похож на метод экземпляра , но отличается от метода тем, что не имеет явного типа возвращаемого значения , не наследуется неявно и обычно имеет другие правила для модификаторов области видимости. Конструкторы часто имеют то же имя, что и объявляющий класс . Их задача — инициализировать объекта элементы данных и установить инвариант класса , что не удается, если инвариант недействителен. Правильно написанный конструктор оставляет результирующий объект в допустимом состоянии. Неизменяемые объекты должны быть инициализированы в конструкторе.
Большинство языков допускают перегрузку конструктора, поскольку для класса может существовать более одного конструктора с разными параметрами. Некоторые языки учитывают некоторые специальные типы конструкторов. Конструкторы, которые конкретно используют один класс для создания объектов и возврата нового экземпляра класса, абстрагируются фабриками , которые также создают объекты, но могут делать это различными способами, используя несколько классов или разные схемы размещения, такие как пул объектов .
Типы
[ редактировать ]Параметризованные конструкторы
[ редактировать ]Конструкторы, которые могут принимать хотя бы один аргумент, называются параметризованными конструкторами. Когда объект объявляется в параметризованном конструкторе, начальные значения должны быть переданы в качестве аргументов функции конструктора. Обычный способ объявления объекта может не работать. Конструкторы могут вызываться явно или неявно. Метод неявного вызова конструктора также называется сокращенным методом.
class Example {
public:
Example();
Example(int a, int b); // Parameterized constructor.
private:
int x_;
int y_;
};
Example::Example() = default;
Example::Example(int x, int y) : x_(x), y_(y) {}
Example e = Example(0, 50); // Explicit call.
Example e2(0, 50); // Implicit call.
Конструкторы по умолчанию
[ редактировать ]Если программист не предоставляет конструктор для экземпляра класса, компилятор Java вставляет в ваш код конструктор по умолчанию от вашего имени. Этот конструктор известен как конструктор по умолчанию. Вы не найдете его в исходном коде (файле Java), поскольку он будет вставлен в код во время компиляции и существует в файле .class. Поведение конструктора по умолчанию зависит от языка. Он может инициализировать элементы данных нулем или другими одинаковыми значениями или вообще ничего не делать. В Java «конструктор по умолчанию» относится к нулевому конструктору, который автоматически генерируется компилятором, если для класса не определены конструкторы или при отсутствии каких-либо конструкторов, определенных программистом (например, в Java конструктор по умолчанию неявно вызывает нулевой конструктор суперкласса, затем выполняет пустое тело). Для всех полей сохраняется исходное значение 0 (целочисленные типы), 0,0 (типы с плавающей запятой), false (логический тип) или null (ссылочные типы)...
#include <iostream>
class Student {
public:
Student(int a = 0, int b = 0); // Default constructor.
int a;
int b;
};
Копировать конструкторы
[ редактировать ]Как и C++, Java также поддерживает «Конструктор копирования». Но, в отличие от C++, Java не создает конструктор копирования по умолчанию, если вы не пишете свой собственный. Конструкторы копирования определяют действия, выполняемые компилятором при копировании объектов класса. Конструктор копирования имеет один формальный параметр, который является типом класса (параметр может быть ссылкой на объект). Он используется для создания копии существующего объекта того же класса. Несмотря на то, что оба класса одинаковы, он считается конструктором преобразования. Хотя конструкторы копирования обычно обозначаются сокращенно copy ctor или cctor, они не имеют ничего общего с конструкторами классов, используемыми в .NET, использующими ту же аббревиатуру.
Конструкторы преобразования
[ редактировать ]Конструкторы преобразования предоставляют компилятору возможность неявно создавать объект, принадлежащий одному классу, на основе объекта другого типа. Эти конструкторы обычно вызываются неявно для преобразования аргументов или операндов в соответствующий тип, но их также можно вызывать явно.
Переместить конструкторы
[ редактировать ]В C++ конструкторы перемещения принимают ссылку Rvalue на объект класса и используются для реализации передачи владения ресурсами объекта параметра.
Синтаксис
[ редактировать ]- 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# также позволяют использовать оператор 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) // Constructor, parameters with default values.
: x_(r * cos(alpha)) // <- Initializer list
{
y_ = r * sin(alpha); // <- Normal assignment
}
private:
double x_;
double y_;
};
Примеры вызовов:
Foobar a,
b(3),
c(5, M_PI/4);
При возврате объектов из функций или передаче объектов по значению конструктор копирования объектов будет вызываться неявно, если не применяется оптимизация возвращаемого значения .
C++ неявно генерирует конструктор копирования по умолчанию, который будет вызывать конструкторы копирования для всех базовых классов и всех переменных-членов, если программист не предоставит его, явно удаляет конструктор копирования (чтобы предотвратить клонирование) или один из базовых классов или конструктор копирования переменных-членов удаляется. или недоступен (частный). В большинстве случаев, требующих настраиваемого конструктора копирования (например, подсчет ссылок , глубокое копирование указателей), также требуется настройка деструктора и оператора присваивания копирования . Это обычно называют правилом трех .
С#
[ редактировать ]Пример конструктора C# :
public class MyClass
{
private int a;
private string b;
// Constructor
public MyClass() : this(42, "string")
{
}
// Overloading a constructor
public MyClass(int a, string b)
{
this.a = a;
this.b = b;
}
}
// Code somewhere
// Instantiating an object with the constructor above
MyClass c = new MyClass(42, "string");
Статический конструктор C#
[ редактировать ]В C# статический конструктор — это инициализатор статических данных. [4] : 111–112 Статические конструкторы также называются конструкторами классов . Поскольку фактический сгенерированный метод имеет имя .cctor, их часто также называют «cctors». [5] [6]
Статические конструкторы позволяют инициализировать сложную статическую переменную. [7] Статические конструкторы вызываются неявно при первом доступе к классу. Любой вызов класса (статический вызов или вызов конструктора) запускает выполнение статического конструктора. Статические конструкторы потокобезопасны и реализуют шаблон Singleton . При использовании в универсальном классе программирования статические конструкторы вызываются при каждом новом универсальном экземпляре, по одному для каждого типа. [8] : 38 [4] : 111 Статические переменные также создаются.
public class MyClass
{
private static int _A;
// Normal constructor
static MyClass()
{
_A = 32;
}
// Standard default constructor
public MyClass()
{
}
}
// Code somewhere
// Instantiating an object with the constructor above
// right before the instantiation
// The variable static constructor is executed and _A is 32
MyClass c = new MyClass();
Язык разметки ColdFusion (CFML)
[ редактировать ]Язык разметки ColdFusion (CFML) использует метод с именем ' init
' как метод конструктора.
Сыр.cfc
component {
// properties
property name="cheeseName";
// constructor
function Cheese init( required string cheeseName ) {
variables.cheeseName = arguments.cheeseName;
return this;
}
}
Создайте экземпляр сыра.
myCheese = new Cheese( 'Cheddar' );
Начиная с ColdFusion 10, [9] CFML также поддерживает указание имени метода конструктора:
component initmethod="Cheese" {
// properties
property name="cheeseName";
// constructor
function Cheese Cheese( required string cheeseName ) {
variables.cheeseName = arguments.cheeseName;
return this;
}
}
Эйфелева
[ редактировать ]В Eiffel процедуры, инициализирующие новые объекты, называются процедурами создания . Процедуры создания имеют следующие особенности:
- Процедуры создания не имеют явного возвращаемого типа (по определению процедуры ). [а]
- Процедуры создания названы.
- Процедуры создания в тексте класса обозначаются по имени как процедуры создания.
- Процедуры создания могут быть явно вызваны для повторной инициализации существующих объектов.
- Каждый эффективный (т. е. конкретный или неабстрактный) класс должен обозначать хотя бы одну процедуру создания.
- Процедуры создания должны оставить вновь инициализированный объект в состоянии, удовлетворяющем инварианту класса. [б]
Хотя создание объекта включает в себя некоторые тонкости, [10] создание атрибута с типовым объявлением x: T
как указано в инструкции по созданию create x.make
состоит из следующей последовательности шагов:
- Создайте новый прямой экземпляр типа
T
. [с] - Выполните процедуру создания
make
во вновь созданный экземпляр. - Присоедините вновь инициализированный объект к сущности
x
.
В первом фрагменте ниже класс POINT
определяется. Процедура make
кодируется после ключевого слова feature
.
Ключевое слово create
представляет список процедур, которые можно использовать для инициализации экземпляров. В этом случае в список входят default_create
, процедура с пустой реализацией, унаследованной от класса ANY
и make
процедура, закодированная внутри класса.
class
POINT
create
default_create, make
feature
make (a_x_value: REAL; a_y_value: REAL)
do
x := a_x_value
y := a_y_value
end
x: REAL
-- X coordinate
y: REAL
-- Y coordinate
...
Во втором фрагменте класс, который является клиентом для 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
...
create my_point_1
create my_point_2.make (3.0, 4.0)
my_point_2.make (5.0, 8.0)
...
Ф#
[ редактировать ]В F# конструктор может включать в себя любой let
или do
операторы, определенные в классе. let
операторы определяют частные поля и do
операторы выполняют код. Дополнительные конструкторы могут быть определены с помощью new
ключевое слово.
type MyClass(_a : int, _b : string) = class
// Primary constructor
let a = _a
let b = _b
do printfn "a = %i, b = %s" a b
// Additional constructors
new(_a : int) = MyClass(_a, "") then
printfn "Integer parameter given"
new(_b : string) = MyClass(0, _b) then
printfn "String parameter given"
new() = MyClass(0, "") then
printfn "No parameter given"
end
// Code somewhere
// instantiating an object with the primary constructor
let c1 = new MyClass(42, "string")
// instantiating an object with additional constructors
let c2 = new MyClass(42)
let c3 = new MyClass("string")
let c4 = MyClass() // "new" keyword is optional
Ява
[ редактировать ]В Java конструкторы отличаются от других методов тем, что:
- Конструкторы никогда не имеют явного возвращаемого типа.
- Конструкторы не могут быть вызваны напрямую (ключевое слово «
new
вызывает их). - Конструкторы не должны иметь модификаторов, запрещающих доступ.
Конструкторы Java выполняют следующие задачи в следующем порядке:
- Вызовите конструктор суперкласса по умолчанию, если конструктор не определен.
- Инициализируйте переменные-члены указанными значениями.
- Выполняет тело конструктора.
Java позволяет пользователям вызывать один конструктор в другом конструкторе, используя this()
ключевое слово.
Но this()
должно быть первым утверждением. [11]
class Example
{
Example() // Non-parameterized constructor
{
this(1); // Calling of constructor
System.out.println("0-arg-cons");
}
Example(int a) // Parameterized constructor
{
System.out.println("1-arg-cons");
}
}
public static void main(String[] args)
{
Example e = new Example();
}
Java предоставляет доступ к конструктору суперкласса через super
ключевое слово.
public class Example
{
// Definition of the constructor.
public Example()
{
this(1);
}
// Overloading a constructor
public Example(int input)
{
data = input; // This is an assignment
}
// Declaration of instance variable(s).
private int data;
}
// Code somewhere else
// Instantiating an object with the above constructor
Example e = new Example(42);
Конструктор, принимающий нулевое количество аргументов, называется конструктором «без аргументов» или «без аргументов». [12]
JavaScript
[ редактировать ]Начиная с ES6, JavaScript имеет прямые конструкторы, как и многие другие языки программирования. Они так и пишутся
class FooBar {
constructor(baz) {
this.baz = baz
}
}
Это можно создать как таковой
const foo = new FooBar('7')
Эквивалентом этого до ES6 было создание функции, которая создает экземпляр объекта как такового.
function FooBar (baz) {
this.baz = baz;
}
Это создается так же, как указано выше.
Объектный Паскаль
[ редактировать ]В Object Pascal конструктор аналогичен фабричному методу . Единственное синтаксическое отличие от обычных методов — это ключевое слово constructor
перед именем (вместо procedure
или function
). Он может иметь любое имя, хотя по соглашению следует иметь Create
в качестве префикса, например, в CreateWithFormatting
. Создание экземпляра класса работает аналогично вызову статического метода класса: TPerson.Create('Peter')
.
program OopProgram;
type
TPerson = class
private
FName: string;
public
property Name: string read FName;
constructor Create(AName: string);
end;
constructor TPerson.Create(AName: string);
begin
FName := AName;
end;
var
Person: TPerson;
begin
Person := TPerson.Create('Peter'); // allocates an instance of TPerson and then calls TPerson.Create with the parameter AName = 'Peter'
end.
OCaml
[ редактировать ]В OCaml есть один конструктор. Параметры определяются сразу после имени класса. Их можно использовать для инициализации переменных экземпляра, и они доступны во всем классе. Анонимный скрытый метод под названием initializer
позволяет оценить выражение сразу после построения объекта. [13]
class person first_name last_name =
object
val full_name = first_name ^ " " ^ last_name
initializer
print_endline("Hello there, I am " ^ full_name ^ ".")
method get_last_name = last_name
end;;
let alonzo = new person "Alonzo" "Church" in (*Hello there, I am Alonzo Church.*)
print_endline alonzo#get_last_name (*Church*)
PHP
[ редактировать ]В PHP версии 5 и выше конструктором является метод с именем __construct()
(обратите внимание, что это двойное подчеркивание), которое обозначает ключевое слово new
автоматически вызывается после создания объекта. Обычно он используется для автоматического выполнения инициализации, например инициализации свойств. Конструкторы также могут принимать аргументы, и в этом случае, когда new
оператор написан, вам также необходимо отправить аргументы конструктора для параметров. [1]
class Person
{
private string $name;
public function __construct(string $name): void
{
$this->name = $name;
}
public function getName(): string
{
return $this->name;
}
}
В PHP классу разрешено объявлять не более одного метода-конструктора. Статические методы, фабричные классы или дополнительные аргументы конструктора — это некоторые способы упростить создание объектов класса PHP.
Перл 5
[ редактировать ]В Perl версии 5 по умолчанию конструкторы являются фабричными методами , то есть методами, которые создают и возвращают объект, что конкретно означает создание и возврат благословенной ссылки. Типичный объект — это ссылка на хэш, хотя ссылки на другие типы используются редко. По соглашению единственный конструктор называется new , хотя разрешено называть его иначе или иметь несколько конструкторов. Например, класс Person может иметь конструктор с именем new и конструктор new_from_file , который считывает файл для атрибутов Person, и new_from_person , который использует другой объект Person в качестве шаблона.
package Person;
# In Perl constructors are named 'new' by convention.
sub new {
# Class name is implicitly passed in as 0th argument.
my $class = shift;
# Default attribute values, if you have any.
my %defaults = ( foo => "bar" );
# Initialize attributes as a combination of default values and arguments passed.
my $self = { %defaults, @_ };
# Check for required arguments, class invariant, etc.
if ( not defined $self->{first_name} ) {
die "Mandatory attribute missing in Person->new(): first_name";
}
if ( not defined $self->{last_name} ) {
die "Mandatory attribute missing in Person->new(): last_name";
}
if ( defined $self->{age} and $self->{age} < 18 ) {
die "Invalid attribute value in Person->new(): age < 18";
}
# Perl makes an object belong to a class by 'bless'.
bless $self, $class;
return $self;
}
1;
Perl 5 с Moose
[ редактировать ]В объектной системе Moose для Perl большую часть этого шаблона можно опустить, создать новый объект по умолчанию, можно указать атрибуты, а также указать, можно ли их устанавливать, сбрасывать или требовать. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD , который будет вызывать конструктор, сгенерированный Moose, после проверки аргументов. value . Можно указать метод BUILDARGS для обработки аргументов конструктора не в форме hashref / key =>
package Person;
# enable Moose-style object construction
use Moose;
# first name ( a string) can only be set at construction time ('ro')
has first_name => (is => 'ro', isa => 'Str', required => 1);
# last name ( a string) can only be set at construction time ('ro')
has last_name => (is => 'ro', isa => 'Str', required => 1);
# age (Integer) can be modified after construction ('rw'), and is not required
# to be passed to be constructor. Also creates a 'has_age' method which returns
# true if age has been set
has age => (is => 'rw', isa => 'Int', predicate => 'has_age');
# Check custom requirements
sub BUILD {
my $self = shift;
if ($self->has_age && $self->age < 18) { # no under 18s
die "No under-18 Persons";
}
}
1;
В обоих случаях класс Person создается следующим образом:
use Person;
my $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("Creating new instance...")
... # Call the superclass constructor to create the instance.
... instance = super(ExampleClass, cls).__new__(cls)
... return instance
... def __init__(self, value):
... print("Initialising instance...")
... self.payload = value
>>> exampleInstance = ExampleClass(42)
Creating new instance...
Initialising instance...
>>> print(exampleInstance.payload)
42
Классы обычно действуют как фабрики для создания новых экземпляров самих себя, то есть класс представляет собой вызываемый объект (например, функцию), причем вызов является конструктором, а вызов класса возвращает экземпляр этого класса. Однако __new__
методу разрешено возвращать что-то кроме экземпляра класса для специализированных целей. В этом случае __init__
не вызывается. [15]
Раку
[ редактировать ]В Raku можно опустить еще больше шаблонов, учитывая, что по умолчанию наследуется новый метод, можно указать атрибуты, а также можно ли их устанавливать, сбрасывать или требовать. Кроме того, любые дополнительные функции конструктора могут быть включены в метод BUILD , который будет вызываться для обеспечения пользовательской инициализации. Можно указать метод TWEAK для постобработки любых уже (неявно) инициализированных атрибутов.
class Person {
has Str $.first-name is required; # First name (a string) can only be set at
# construction time (the . means "public").
has Str $.last-name is required; # Last name (a string) can only be set at
# construction time (a ! would mean "private").
has Int $.age is rw; # Age (an integer) can be modified after
# construction ('rw'), and is not required
# during the object instantiation.
# Create a 'full-name' method which returns the person's full name.
# This method can be accessed outside the class.
method full-name { $!first-name.tc ~ " " ~ $!last-name.tc }
# Create a 'has-age' method which returns true if age has been set.
# This method is used only inside the class so it's declared as "private"
# by prepending its name with a !
method !has-age { self.age.defined }
# Check custom requirements
method TWEAK {
if self!has-age && $!age < 18 { # No under 18
die "No person under 18";
}
}
}
Класс Person создается следующим образом:
my $p0 = Person.new( first-name => 'Sam', last-name => 'Ashe', age => 42 );
my $p1 = Person.new( first-name => 'grace', last-name => 'hopper' );
say $p1.full-name(); # OUTPUT: «Grace Hopper»
В качестве альтернативы именованные параметры можно указать с использованием синтаксиса пары двоеточий в Perl 6:
my $p0 = Person.new( :first-name<Sam>, :last-name<Ashe>, :age(42) );
my $p1 = Person.new( :first-name<Grace>, :last-name<Hopper> );
И если вы установили переменные с именами, идентичными именованным параметрам, вы можете использовать ярлык, который будет использовать имя переменной для именованного параметра:
my $first-name = "Sam";
my $last-name = "Ashe";
my $age = 42;
my $p0 = Person.new( :$first-name, :$last-name, :$age );
Руби
[ редактировать ]В Ruby конструкторы создаются путем определения метода с именем initialize
. Этот метод выполняется для инициализации каждого нового экземпляра.
irb(main):001:0> class ExampleClass
irb(main):002:1> def initialize
irb(main):003:2> puts "Hello there"
irb(main):004:2> end
irb(main):005:1> end
=> nil
irb(main):006:0> ExampleClass.new
Hello there
=> #<ExampleClass:0x007fb3f4299118>
Визуальный Бейсик .NET
[ редактировать ]В Visual Basic .NET конструкторы используют объявление метода с именем « New
".
Class Foobar
Private strData As String
' Constructor
Public Sub New(ByVal someParam As String)
strData = someParam
End Sub
End Class
' code somewhere else
' instantiating an object with the above constructor
Dim foo As New Foobar(".NET")
См. также
[ редактировать ]- Получение ресурсов — это инициализация (RAII)
- Место размещения
- Творческий шаблон
- Деструктор (компьютерное программирование)
- Глобальный конструктор в C++ и его аналог в C, ((constructor)) атрибут функции
Примечания
[ редактировать ]- ^ Eiffel Подпрограммы — это либо процедуры , либо функции . Процедуры никогда не имеют возвращаемого типа. Функции всегда имеют возвращаемый тип.
- ^ Поскольку инвариант унаследованного класса должен быть удовлетворен, обязательный вызов родительских конструкторов не требуется.
- ^ Стандарт Eiffel требует, чтобы поля были инициализированы при первом доступе, поэтому нет необходимости выполнять инициализацию полей по умолчанию во время создания объекта.
Ссылки
[ редактировать ]- ^ Перейти обратно: а б с Конструкторы и деструкторы из онлайн-документации PHP.
- ^ Модель данных из онлайн-документации Python.
- ^ https://stackoverflow.com/questions/1242830/constructor-initialization-list-evaluation-order Конструктор
- ^ Перейти обратно: а б Альбахари, Джозеф. C# 10 в двух словах О'Рейли. ISBN 978-1-098-12195-2 .
- ^ «Сказочные приключения в программировании» . Эрик Липперт. 6 февраля 2013 г. Проверено 5 апреля 2014 г.
- ^ Экспертный ассемблер .NET 2.0 IL . Пресс. 01 января 2006 г. ISBN 9781430202233 . Проверено 5 апреля 2014 г.
- ^ Статический конструктор на C# в MSDN.
- ^ Скит, Джон. C# в глубине . Мэннинг. ISBN 978-1617294532 .
- ^ CFComponent
- ^ Документ спецификации Eiffel ISO/ECMA
- ^ Подробности о конструкторе в Java
- ^ «Предоставление конструкторов для ваших классов» . Корпорация Оракл. 2013 . Проверено 20 декабря 2013 г.
- ^ Руководство по OCaml
- ^ Модель данных
- ^ Модель данных