Jump to content

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

В классов на основе объектно-ориентированном программировании конструктор вызываемый (аббревиатура: 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" и " initalloc метод выделения (выделения) памяти для экземпляра класса, а метод 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 выполняют следующие задачи в следующем порядке:

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

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]

Начиная с 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 есть один конструктор. Параметры определяются сразу после имени класса. Их можно использовать для инициализации переменных экземпляра, и они доступны во всем классе. Анонимный скрытый метод под названием 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 версии 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.

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

См. также

[ редактировать ]

Примечания

[ редактировать ]
  1. ^ Eiffel Подпрограммы — это либо процедуры , либо функции . Процедуры никогда не имеют возвращаемого типа. Функции всегда имеют возвращаемый тип.
  2. ^ Поскольку инвариант унаследованного класса должен быть удовлетворен, обязательный вызов родительских конструкторов не требуется.
  3. ^ Стандарт Eiffel требует, чтобы поля были инициализированы при первом доступе, поэтому нет необходимости выполнять инициализацию полей по умолчанию во время создания объекта.
  1. ^ Перейти обратно: а б с Конструкторы и деструкторы из онлайн-документации 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. ^ Модель данных
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: edbdddf70e7e5184511d4b4de60112c0__1710308880
URL1:https://arc.ask3.ru/arc/aa/ed/c0/edbdddf70e7e5184511d4b4de60112c0.html
Заголовок, (Title) документа по адресу, URL1:
Constructor (object-oriented programming) - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)