Как вызвать конструктор c
Перейти к содержимому

Как вызвать конструктор c

  • автор:

Использование конструкторов (Руководство по программированию на C#)

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

В следующем примере класс с именем Taxi определяется с помощью простого конструктора. Затем оператор new создает экземпляр этого класса. Конструктор Taxi вызывается оператором new сразу после того, как новому объекту будет выделена память.

public class Taxi < public bool IsInitialized; public Taxi() < IsInitialized = true; >> class TestTaxi < static void Main() < Taxi t = new Taxi(); Console.WriteLine(t.IsInitialized); >> 

Конструктор, который не принимает никаких параметров, называется конструктором без параметров. Конструкторы без параметров вызываются всякий раз, когда создается экземпляр объекта с помощью оператора new , а аргументы в new не передаются. В C# 12 представлены основные конструкторы. Основной конструктор задает параметры, которые необходимо предоставить для инициализации нового объекта. Дополнительные сведения см. в разделе Конструкторы экземпляров.

Если класс не является статическим, компилятор C# выделяет классам без конструкторов открытый конструктор без параметров, позволяющий создавать экземпляры классов. Дополнительные сведения см. в статье Статические классы и члены статических классов.

Создание экземпляров класса можно запретить, сделав конструктор закрытым, следующим образом:

class NLog < // Private Constructor: private NLog() < >public static double e = Math.E; //2.71828. > 

Дополнительные сведения см. в разделе Закрытые конструкторы.

Конструкторы для типов структур похожи на конструкторы классов. При создании экземпляра типа структуры с new помощью вызывается конструктор . Если для struct задано значение default , среда выполнения инициализирует всю память в структуре равным 0. До C# 10 не может содержать явный конструктор без параметров, structs так как он предоставляется компилятором автоматически. Дополнительные сведения см. в разделе инициализация структуры и значения по умолчанию статьи Типы структур .

В следующем коде используется конструктор без параметров для Int32, чтобы вы были уверены, что целое число инициализировано:

int i = new int(); Console.WriteLine(i); 

Однако следующий код вызывает ошибку компилятора, так как он не использует new и пытается использовать объект, который не был инициализирован:

int i; Console.WriteLine(i); 

Кроме того, объекты на основе structs (включая все встроенные числовые типы) можно инициализировать или назначить, а затем использовать, как в следующем примере:

int a = 44; // Initialize the value type. int b; b = 33; // Or assign it before using it. Console.WriteLine(", ", a, b); 

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

public class Employee < public int Salary; public Employee() < >public Employee(int annualSalary) < Salary = annualSalary; >public Employee(int weeklySalary, int numberOfWeeks) < Salary = weeklySalary * numberOfWeeks; >> 

Этот класс можно создать, воспользовавшись одним из следующих операторов:

Employee e1 = new Employee(30000); Employee e2 = new Employee(500, 52); 

Конструктор может использовать ключевое слово base для вызова конструктора базового класса. Пример:

public class Manager : Employee < public Manager(int annualSalary) : base(annualSalary) < //Add further instructions here. >> 

В этом примере конструктор базового класса вызывается перед выполнением соответствующего ему блока. Ключевое слово base можно использовать как с параметрами, так и без них. Любые параметры для конструктора можно использовать как параметры для base или как часть выражения. Дополнительные сведения см. в разделе base.

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

public Manager(int initialData) < //Add further instructions here. >
public Manager(int initialData) : base() < //Add further instructions here. >

Если базовый класс не предлагает конструктор без параметров, производный класс должен выполнить явный вызов базового конструктора с помощью base .

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

public Employee(int weeklySalary, int numberOfWeeks) : this(weeklySalary * numberOfWeeks)

Применение ключевого слова this в приведенном выше примере привело к вызову конструктора:

public Employee(int annualSalary)

Конструкторы могут иметь пометку public, private, protected, internal, protected internal или private protected. Эти модификаторы доступа определяют, каким образом пользователи класса смогут создавать класс. Дополнительные сведения см. в статье Модификаторы доступа.

Конструктор можно объявить статическим, используя ключевое слово static. Статические конструкторы вызываются автоматически непосредственно перед доступом к любым статическим полям и используются для инициализации членов статического класса. Дополнительные сведения см. в разделе Статические конструкторы.

Спецификация языка C#

Дополнительные сведения см. в разделах Конструкторы экземпляров и Статические конструкторы в Спецификации языка C#. Спецификация языка является предписывающим источником информации о синтаксисе и использовании языка C#.

См. также

  • Руководство по программированию на C#
  • Система типов C#
  • Конструкторы
  • Методы завершения

Совместная работа с нами на GitHub

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

Как из одного конструктора вызвать другой конструктор в C++?

При этом одновременно с вызовом другого конструктора нельзя вызывать конструкторы членов класса, например:

struct B < B() : x(1) <>B(int x_) : B(), x(x_) <> // ОШИБКА: нельзя одновременно вызвать B() и x() int x; >; 

Как только был вызван один из конструкторов, объект считается полностью сконструированным, по этому исключение из вызывающего конструктора приведет к вызову деструктора класса:

struct C < C(const char*) < throw 1; >C() <> C(int) : C() < throw 1; >~C() < std::cout >; int main() < try < C c(""); // ничего не будет напечатано, деструктор не будет вызван >catch (. ) <> try < C c(1); // будет напечатано "~C" >catch (. ) <> > 

Конструкторы и наследование

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

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

Когда конструкторы определяются как в базовом, так и в производном классе, процесс построения объекта несколько усложняется, поскольку должны выполняться конструкторы обоих классов. В данном случае приходится обращаться к ключевому слову base, которое находит двоякое применение: во-первых, для вызова конструктора базового класса; и во-вторых, для доступа к члену базового класса, скрывающегося за членом производного класса.

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

конструктор_производного_класса(список_параметров) : base (список_аргументов) < // тело конструктора >

где список_аргументов обозначает любые аргументы, необходимые конструктору в базовом классе. Обратите внимание на местоположение двоеточия.

Давайте рассмотрим пример:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleApplication1 < class MyClass < public int x, y, z; // Конструктор базового класса public MyClass(int x, int y, int z) < this.x = x; this.y = y; this.z = z; >> class ClassA : MyClass < int point; // Конструктор производного класса public ClassA(int point, int x, int y, int z) : base(x, y, z) < this.point = point; >public void Pointer(ClassA obj) < obj.x *= obj.point; obj.y *= obj.point; obj.z *= obj.point; Console.WriteLine("Новые координаты объекта:  ", obj.x, obj.y, obj.z); > > class Program < static void Main() < ClassA obj = new ClassA(10, 1, 4, 3); Console.WriteLine("Координаты объекта:  ", obj.x, obj.y, obj.z); obj.Pointer(obj); Console.ReadLine(); > > > 

Определение конструкторов при наследовании в C#

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

А теперь рассмотрим вкратце основные принципы действия ключевого слова base. Когда в производном классе указывается ключевое слово base, вызывается конструктор из его непосредственного базового класса. Следовательно, ключевое слово base всегда обращается к базовому классу, стоящему в иерархии непосредственно над вызывающим классом. Это справедливо даже для многоуровневой иерархии классов. Аргументы передаются базовому конструктору в качестве аргументов метода base(). Если же ключевое слово отсутствует, то автоматически вызывается конструктор, используемый в базовом классе по умолчанию.

Вызов конструктора из конструктора

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

Вызов конструктора из конструктора - 1

Вот пример, как это можно делать:
�� Виктор Уровень 20 Expert
18 сентября 2020
Спасибо, помогли решить задачу.
Alexandr Уровень 23
12 сентября 2020
15 мая 2020
Отлично помогли, благодарю! Исправьте ошибку — «избежать (чего?) написаниЯ»
23 апреля 2020

при вызове конструктора java автоматом определяет какой вызывать в зависимости от количества требуемых параметров?

Glock Уровень 13
13 апреля 2020
Спасибо! мне помогло, может и простая вещь это, но затык был.
RedToad Уровень 22
10 марта 2020
По моему, бесполезная статья.
10 февраля 2020
Поделитесь видео по теме
Сообщество

JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.

Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2024 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2024 JavaRush

Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *