Что такое параметризированный конструктор с
Перейти к содержимому

Что такое параметризированный конструктор с

  • автор:

Конструкторы (руководство по программированию на C#)

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

Существует несколько действий, которые являются частью инициализации нового экземпляра. Эти действия выполняются в следующем порядке:

  1. Поля экземпляра имеют значение 0. Обычно это делает среда выполнения.
  2. Выполняются инициализаторы полей. Инициализаторы полей в наиболее производном типе выполняются.
  3. Выполняются инициализаторы полей базового типа. Инициализаторы полей, начиная с прямого базового типа до каждого базового типа.System.Object
  4. Выполняются конструкторы базовых экземпляров. Любые конструкторы экземпляров, начиная с Object.Object каждого базового класса до прямого базового класса.
  5. Выполняется конструктор экземпляра. Конструктор экземпляра для выполнения типа.
  6. Выполняются инициализаторы объектов. Если выражение содержит инициализаторы объектов, они выполняются после выполнения конструктора экземпляра. Инициализаторы объектов выполняются в текстовом порядке.

Предыдущие действия выполняются при инициализации нового экземпляра. Если для нового экземпляра задано значение default , для всех полей экземпляра struct устанавливается значение 0.

Если статический конструктор не был запущен, статический конструктор выполняется до выполнения каких-либо действий конструктора экземпляра.

Синтаксис конструктора

Конструктор — это метод, имя которого совпадает с именем его типа. Его сигнатура метода включает только необязательный модификатор доступа, имя метода и список параметров; он не включает тип возвращаемого значения. В приведенном ниже примере демонстрируется конструктор для класса с именем Person .

public class Person < private string last; private string first; public Person(string lastName, string firstName) < last = lastName; first = firstName; >// Remaining implementation of Person class. > 

Если конструктор поддерживает реализацию в виде оператора, можно использовать определение тела выражения. В следующем примере определяется класс Location , конструктор которого имеет один строковый параметр name. Определение тела выражения присваивает аргумент полю locationName .

public class Location < private string locationName; public Location(string name) =>Name = name; public string Name < get =>locationName; set => locationName = value; > > 

Статические конструкторы

В приведенных выше примерах показаны конструкторы экземпляров, которые создают новый объект. В классе или структуре также может быть статический конструктор, который инициализирует статические члены типа. Статические конструкторы не имеют параметров. Если вы не предоставили статический конструктор для инициализации статических полей, компилятор C# инициализирует статические поля значениями по умолчанию, как показано в статье Значения по умолчанию типов C#.

В следующем примере статический конструктор используется для инициализации статического поля.

public class Child : Person < private static int maximumAge; public Child(string lastName, string firstName) : base(lastName, firstName) < >static Child() => maximumAge = 18; // Remaining implementation of Child class. > 

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

public class Child : Person < private static int maximumAge; public Child(string lastName, string firstName) : base(lastName, firstName) < >static Child() => maximumAge = 18; // Remaining implementation of Child class. > 

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

В этом разделе

  • Использование конструкторов
  • Конструкторы экземпляров
  • Частные конструкторы
  • Статические конструкторы
  • Практическое руководство. Создание конструктора копий

См. также

  • Руководство по программированию на C#
  • Система типов C#
  • Методы завершения
  • static
  • Why Do Initializers Run In The Opposite Order As Constructors? Part One (Почему инициализаторы выполняются в порядке, обратном действию конструкторов? Часть 1)

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

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

Что такое Конструктор в C++?

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

Конструктор по умолчанию:

class MyClass < public: // Конструктор по умолчанию MyClass() < // Инициализация переменных, если необходимо >>;

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

class Rectangle < public: // Параметризованный конструктор Rectangle(int w, int h) : width(w), height(h) < // Дополнительные операции при создании объекта >private: int width; int height; >;

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

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

Когда использовать конструкторы:

  • При необходимости выполнения определенных действий при создании объекта.
  • Для инициализации членов класса перед использованием объекта.

Использование конструкторов в C++ является важной частью объектно-ориентированного программирования и позволяет эффективно управлять жизненным циклом объектов.

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

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

// создание класса очередь
class queue int q[100];
int sloс, rloc;
int who; // содержит идентификатор очереди
public:
queue(int id); // параметризированный конструктор
~queue (); // деструктор
void qput(int i);
int qget();
>

Переменная who используется для хранения значения идентификатора, служащего для иденти­фикации объекта типа queue. Его значение определяется аргументом id при создании объекта. Конструктор queue() будет выглядеть следующим образом:

Для передачи аргумента конструктору необходимо задать его значение при объявлении объек­та. С++ поддерживает два способа решения этой задачи. Первый из них выглядит следующим образом:

queue а = queue(101);

Здесь конструктор класса queue вызывается непосредственно с передачей ему значения 101. Значе­нием переменной а служит сам созданный объект.

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

Поскольку этот метод используется почти всеми программистами, пишущими на языке С++, то он и будет использоваться.

Общая форма для передачи аргументов конструктору имеет следующий вид:

Здесь список_аргументов представляет собой список аргументов, разделенных запятыми. Эти ар­гументы и передаются конструктору.

Следующая версия программы queue демонстрирует передачу аргументов конструктору:

#include
// создание класса очередь
class queue int q[100];
int sloс, rloc;
int who; // содержит идентификатор очереди
public:
queue (int id); // параметризированный конструктор
~queue(); // деструктор
void qput(int i);
int qget();
> ;
/ / конструктор
queue::queue(int id)
sloс = rloc = 0;
who = id;
cout >
/ / деструктор
queue::~queue()
cout >
void queue::qput(int i)
if (sloс == 99) cout return;
>
sloc++;
q[sloc] = i;
>
int queue::qget()
if (rloc == sloс) cout return 0;
>
rloc++;
return q[rloc];
>
int main()
queue a(1), b(2); // создание двух объектов типа queue
a.qput(10);
b.qput(19);
a.qput(20);
b.qput(1);
cout cout cout cout return 0;
>

Эта программа выводит следующий текст:

Queue 1 initialized.
Queue 2 initialized.
10 20 19 1
Queue 2 destroyed.
Queue 1 destroyed.

Посмотрев на функцию main(), мы увидим, что объект а имеет в качестве идентификатора 1, а объект b — 2.

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

#include
class widget int i;
int j;
public:
widget (int a, int b);
void put_widget();
>;
widget::widget (int a, int b)
i = a;
j = b;
>
void widget::put__widget ()
cout >
int main()
widget x(10, 20),
y(0, 0);
x.put_widget();
у.put_widget();
return 0;
>

Эта программа выведет на экран значения
10 20
0 0

Java. Конструкторы. Параметризированные конструкторы. Ключевое слово this. Сборка «мусора». Метод finalize(). Присваивание ссылок на объекты

Конструкторы. Параметризированные конструкторы. Ключевое слово this . Сборка «мусора». Метод finalize() . Присваивание ссылок на объекты

Поиск на других ресурсах:

1. Что называется конструктором класса? Назначение конструктора

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

Общая форма объявления конструктора

ClassName(parameters) < // тело конструктора // . >
  • ClassName – имя конструктора, которое совпадает с именем класса. Конструктор не возвращает значения;
  • parameters – параметры конструктора. Конструктор может быть без параметров (по умолчанию).
2. Примеры использования конструкторов класса

Пример 1. Объявление и использование класса Month , содержащего информацию о месяце года.

В классе объявляется:

  • внутренняя, скрытая ( private ) переменная класса с именем month;
  • конструктор без параметров, устанавливающий значение внутренней переменной month в 1 (январь);
  • конструктор с одним параметром, инициализирующий значение переменной month начальным значением;
  • методы доступа Get() , Set() к внутренней переменной month ;
  • методы Next() и Prev() , которые устанавливают следующий и предшествующий месяцы в году;
  • метод MonthStr() , возвращающий название месяца.
public class Month < // класс, который описывает месяц года private int month; // внутренняя переменная (ключевое слово private) // Объявление конструкторов класса // конструктор без параметров Month() < month = 1; // месяц "январь" по умолчанию > // конструктор с одним параметром Month(int mn) < if ((mn>=1)&&(mn<=12)) // проверка, верно ли задан номер месяца 1..12 month = mn; else month = 1; > // Методы класса // методы доступа int Get() < return month; > // взять текущий номер месяца void Set(int nmonth) < // установить новое значение if ((nmonth>=1)&&(nmonth<=12)) month = nmonth; > // Дополнительные методы класса // установить следующий месяц в году int Next() < month++; if (month==13) month = 1; return month; > // установить предшествующий месяц в году int Prev() < month--; if (month==0) month = 12; return month; > // взять название месяца String MonthStr() < String s=""; if (month==1) s = "Jan"; if (month==2) s = "Feb"; if (month==3) s = "Mar"; if (month==4) s = "Apr"; if (month==5) s = "May"; if (month==6) s = "Jun"; if (month==7) s = "Jul"; if (month==8) s = "Aug"; if (month==9) s = "Sep"; if (month==10) s = "Oct"; if (month==11) s = "Nov"; if (month==12) s = "Dec"; return s; > >

Использование класса в другой функции:

Month m1 = new Month(); // вызов конструктора без параметров int d; String s; d = m1.Get(); // d = 1 d = m1.Prev(); // d = 12 s = m1.MonthStr(); // s = "Dec" Month m2 = new Month(5); // вызов конструктора с 1 параметром d = m2.Get(); // d = 5 m2.Next(); s = m2.MonthStr(); // s = "Jun" m2.Set(9); s = m2.MonthStr(); // s = "Sep"

Пример 2. Пусть задан класс MyRect , описывающий прямоугольник. Для прямоугольника задаются следующие внутренние переменные:

  • координаты x , y левого верхнего угла экрана;
  • длины сторон dx , dy прямоугольника.
  • в классе реализованы 3 конструктора и 6 методов:
  • конструктор без параметров;
  • конструктор с 2 параметрами (параметризированный конструктор);
  • конструктор с 4 параметрами (параметризированный конструктор);
  • методы чтения значений внутренних переменных GetX() , GetY() , GetDX() , GetDY() ;
  • метод Set() , устанавливающий новые значения внутренних переменных;
  • метод Square() , вычисляющий площадь прямоугольника.
public class MyRect < // внутренние переменные класса private int x, y, dx , dy; // скрытые - ключевое слово private // Конструкторы класса // конструктор без параметров MyRect() < x = 0; y = 0; dx = 1; dy = 1; > // параметризированный конструктор с двумя параметрами MyRect(int dx, int dy) < this.dx = dx; this.dy = dy; x = 0; y = 0; > // параметризированный конструктор с 4 параметрами MyRect(int nx, int ny, int ndx, int ndy) < x = nx; y = ny; dx = ndx; dy = ndy; > // Методы класса // чтение внутренних данных класса int GetX() < return x; > int GetY() < return y; > int GetDX() < return dx; > int GetDY() < return dy; > // запись новых значений во внутренние данные класса void Set(int nx, int ny, int ndx, int ndy) < x = nx; y = ny; dx = ndx; dy = ndy; > // метод, который вычисляет площадь прямоугольника int Square() < return (int)(dx*dy); > >

В параметризированном конструкторе с 2 параметрами на вход поступают внутренние параметры с именами dx , dy . Такие самые имена имеют внутренние переменные класса. Чтобы доступиться к внутренним переменным класса за пределами тела конструктора, используется ключевое слово this :

. this.dx = dx; this.dy = dy; .

Использование класса в другом программном коде (например, функции main ):

// использование класса MyRect r1 = new MyRect(); // вызов конструктора без параметров int d; // проверка d = r1.GetDX(); // d = 1 r1.Set(5, 6, 2, 3); // вызов метода Set() класса int s = r1.Square(); // s = 6 - площадь прямоугольника // вызов конструктора с 2 параметрами MyRect r2 = new MyRect(5,4); d = r2.GetX(); // d = 0 d = r2.GetDY(); // d = 4 // вызов конструктора с 4 параметрами MyRect r3 = new MyRect(2,3,8,9); d = r3.GetDY(); // d = 9 d = r3.Square(); // d = 72 - площадь, метод Square()
3. Что такое параметризированные конструкторы?

Параметризированные конструкторы – это конструкторы, получающие параметры.

4. Для чего используется ключевое слово this ? Пример

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

Пример. Пусть дан класс DWeek , описывающий (реализующий) день недели.

В классе объявляется:

  • внутренняя переменная day ;
  • конструктор без параметров;
  • конструктор с 1 параметром;
  • методы доступа Get() и Set() ;
  • метод IsDayOff() , определяющий, выходной этот день или нет.
// Класс, который описывает день недели public class DWeek < // внутренняя скрытая (private) переменная day  private int day; // Конструкторы класса DWeek() // конструктор без параметров < day = 1; // Понедельник > // конструктор с 1 параметром DWeek(int day) < // доступ к переменной-экземпляру класса day с помощью ключевого слова this if ((day>=1)&&(day<=7)) this.day = day; > // методы доступа int Get() < return day; > void Set(int day) < // доступ к переменной экземпляру: this.day if ((day>=1)&&(day<=7)) this.day = day; > // метод, который определяет, выходной этот день или нет boolean IsDayOff() < int d; // внутренняя переменная // вызов метода Get() класса с помощью ключевого слова this d = this.Get(); // взять текущий день boolean b = true; if ((d>=1)&&(d<=5)) b = false; return b; > >

В конструкторе с 1 параметром входной параметр имеет такое же имя как и внутренняя переменная класса day . Поэтому, чтобы доступиться к переменной-экземпляру класса day используется ключевое слово this :

// конструктор с 1 параметром DWeek(int day) < // доступ к переменной-экземпляру класса day с помощью ключевого слова this this.day = day; >

Это же касается и метода Set() , в котором имя входного параметра совпадает с именем экземпляра класса. В этих двух случаях использование ключевого слова this есть эффективным. Конечно, при желании можно изменить имя входного параметра и обойтись без слова this .

В методе IsDayOff() для доступа к методу Get() используется ключевое слово this (в демонстрационных целях).

Использование класса в другом методе

public static void main(String[] args) < // использование класса DWeek DWeek dw1 = new DWeek(); // вызов конструктора без параметров boolean b; int d; b = dw1.IsDayOff(); // b = false d = dw1.Get(); // d = 1 DWeek dw2 = new DWeek(7); b = dw2.IsDayOff(); // b = true dw2.Set(4); d = dw2.Get(); // d = 4 b = dw2.IsDayOff(); // b = false System.out.println(d); >
5. Что означает термин «сборка мусора»? Как происходит «сборка мусора»?

«Сборка мусора» – это автоматическое уничтожение объектов в оперативной памяти, которые больше не используются в программе. «Сборка мусора» используется для освобождения памяти под объекты, которые еще существуют в программе и больше не используются. В языке Java уничтожать объекты явным образом не нужно. Разные реализации Java используют разные подходы к «сборке мусора».

6. Какое назначение метода finalize() в Java?

В методе finalize() указываются действия, которое должны быть выполнены перед уничтожением объекта. Это могут быть, например, сохранение промежуточных данных/результатов, уничтожение дескриптора файла и т.д.

Если метод finalize() определен в классе, то он вызывается перед тем как должен быть уничтожен объект класса «сборщиком мусора». Эта процедура выглядит приблизительно так:

  • «сборщик мусора» время от времени запускается и проверяет наличие объектов, на которые отсутствуют ссылки. Эти объекты нужно удалить;
  • для найденных объектов сначала вызывается метод finalize() , если он определен в классе. В этом методе выполняются соответствующие действия по освобождению «отличных от Java» ресурсов;
  • удаляется найденный объект.

Метод finalize() имеет следующий общий вид:

protected void finalize() < // тело метода // . >

Этот метод должен быть объявлен в классе, например:

class MyClass < // .  protected void finalize() < // . > // . >
7. Каким образом реализуется присваивание переменным ссылок на объекты класса?

Если объявлены две переменные (два объекта) некоторого класса с именами v1 и v2 и для переменной v1 выделена память оператором new , то строка

v2 = v1;

будет означать следующее:

  • переменная v2 содержит ссылку на объект v1 ;
  • переменные v2 и v1 ссылаются на одну и ту же область памяти. Это означает, что память для переменной v2 не выделяется. Изменения по ссылке в переменной v1 приведут к одним и тем же изменениям в переменной v2 (и наоборот);
  • эти переменные не связаны между собой. То есть, если изменить значение одной из переменных, то это не повлияет на значение другой переменной (другая переменная останется ссылаться на исходный объект).

Связанные темы

  • Применение классов в программах на Java. Определение класса и объекта класса. Примеры
  • Перегрузка методов в классах. Перегрузка конструкторов

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

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