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

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

  • автор:

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

Конструкторам можно передавать аргументы. Обычно эти аргументы используются для того, чтобы помочь инициализировать создаваемый объект. Для того, чтобы создать параметризированный конструктор, достаточно попросту добавить параметры, как это делается для любой другой фун­кции. При определении тела конструктора, т.е. кода, который реализует конструктор, эти пара­метры используются для инициализации объекта. Например, можно усовершенствовать класс 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

23.Конструкторы и деструкторы. Параметризованные конструкторы. Встраиваемые функции в объявлении класса.

Конструкторы и деструкторы Конструктор — это функция, которая вызывается при создании объекта. Как правило, некоторую часть объекта, прежде чем его можно будет использовать, необходимо инициализировать. Например, рассмотрим класс queue (он представлен выше в этой главе). Прежде чем класс queue можно будет использовать, переменным rloc и sloc нужно присвоить нулевые значения. В данном конкретном случае это требование выполнялось с помощью функции init(). Но, поскольку требование инициализации членов класса весьма распространено, в C++ предусмотрена реализация этой возможности при создании объектов класса. Такая автоматическая инициализация выполняется благодаря использованию конструктора. Конструктор — это специальная функция, которая является членом класса и имя которой совпадает с именем класса. Вот, например, как стал выглядеть класс queue после переделки, связанной с применением конструктора для инициализации его членов. // Определение класса queue. class queue < int q[100]; int sloc, rloc; public: queue (); // конструктор void qput(int i); int qget(); >; Обратите внимание на то, что в объявлении конструктора queue() отсутствует тип возвращаемого значения. В C++ конструкторы не возвращают значений и, следовательно, нет смысла в указании их типа. (При этом нельзя указывать даже тип void.) Теперь приведем код функции queue(). // Определение конструктора. queue::queue() < sloc = rloc = 0; cout В данном случае при выполнении конструктора выводится сообщение Очередь инициализирована., которое служит исключительно иллюстративным целям. На практике же в большинстве случаев конструкторы не выводят никаких сообщений. Конструктор объекта вызывается при создании объекта. Это означает, что он вызывается при выполнении инструкции объявления объекта. Конструкторы глобальных объектов вызываются в самом начале выполнения программы, еще до обращения к функции main(). Что касается локальных объектов, то их конструкторы вызываются каждый раз, когда встречается объявление такого объекта. Деструктор — это функция, которая вызывается при разрушении объекта. Дополнением к конструктору служит деструктор. Во многих случаях при разрушении объекту необходимо выполнить некоторое действие или даже некоторую последовательность действий. Локальные объекты создаются при входе в блок, в котором они определены, и разрушаются при выходе из него. Глобальные объекты разрушаются при завершении программы. Существует множество факторов, обусловливающих необходимость деструктора. Например, объект должен освободить ранее выделенную для него память. В C++ именно деструктору поручается обработка процесса дезактивизации объекта. Имя деструктора совпадает с именем конструктора, но предваряется символом «~» (тильда). Подобно конструкторам деструкторы не возвращают значений, а следовательно, в их объявлениях отсутствует тип возвращаемого значения. Рассмотрим уже знакомый нам класс queue, но теперь он содержит конструктор и деструктор. (Справедливости ради отметим, что классу queue деструктор, по сути, не нужен, а его наличие здесь можно оправдать лишь иллюстративными целями.) // Определение класса queue, class queue < int q[100]; int sloc, rloc; public: queue(); // конструктор ~queue(); // деструктор void qput(int i); int qget(); >; // Определение конструктора. queue::queue() < sloe = rloc = 0; cout // Определение деструктора, queue::~queue() < cout Вот как выглядит новая версия программы реализации очереди, в которой демонстрируется использование конструктора и деструктора. //274 // Демонстрация использования конструктора и деструктора, #include #include // Определение класса queue, class queue < int q[100]; int sloc, rloc; public: queue(); // конструктор ~queue(); // деструктор void qput(int i); int qget() ; >; // Определение конструктора. queue::queue () < sloc = rloc = 0; cout // Определение деструктора. queue::~queue() < cout // Занесение в очередь целочисленного значения. void queue::qput(int i) < if(sloc==100) < cout sloc++; q[sloc] = i; > // Извлечение из очереди целочисленного значения, int queue::qget() < if(rloc == sloc) rloc++; return q[rloc]; > int main () При выполнении этой программы получаются такие результаты. Очередь инициализирована. Очередь инициализирована. 10 20 19 1 Очередь разрушена. Очередь разрушена. Параметризованные конструкторы Конструктор может иметь параметры. С их помощью при создании объекта членам данных (переменным класса) можно присвоить некоторые начальные значения, определяемые в программе. Это реализуется путем передачи аргументов конструктору объекта. В следующем примере мы усовершенствуем класс queue так, чтобы он принимал аргументы, которые будут служить идентификационными номерами (ID) очереди. Прежде всего необходимо внести изменения в определение класса queue. Теперь оно выглядит так. // Определение класса queue, class queue < int q[100]; int sloc, rloc; int who; // содержит идентификационный номер очереди public: queue(int id); // параметризованный конструктор ~queue(); // деструктор void qput(int i); int qget(); >; Переменная who используется для хранения идентификационного номера (ID) создаваемой программой очереди. Ее реальное значение определяется значением, передаваемым конструктору в качестве параметра id, при создании переменной типа queue. Конструктор queue() выглядит теперь следующим образом. // Определение конструктора, queue::queue(int id) < sloc = rloc = 0; who = id; cout Чтобы передать аргумент конструктору, необходимо связать этот аргумент с объектом при объявлении объекта. C++ поддерживает два способа реализации такого связывания. Вот как выглядит первый способ. queue a = queue(101); В этом объявлении создается очередь с именем а, которой передается значение (идентификационный номер) 101. Но эта форма (в таком контексте) используется редко, поскольку второй способ имеет более короткую запись и удобнее для использования. Во втором способе аргумент должен следовать за именем объекта и заключаться в круглые скобки. Например, следующая инструкция эквивалентна предыдущему объявлению. queue a(101) ; Это самый распространенный способ объявления параметризованных объектов. Опираясь на этот метод, приведем общий формат передачи аргументов конструкторам. тип_класса имя_переменной(список_аргументов); Здесь элемент список_аргументов представляет собой список разделенных запятыми аргументов, передаваемых конструктору На заметку. Формально между двумя приведенными выше формами инициализации существует небольшое различие, которое вы поймете при дальнейшем чтении этой книги. Но это различие не влияет на результаты выполнения программ, представленных в этой главе. В следующей версии программы организации очереди демонстрируется использование параметризованного конструктора. //277 // Использование параметризованного конструктора. #include #include // Определение класса queue, class queue < int q[100]; int sloc, rloc; int who; // содержит идентификационный номер очереди public: queue(int id); // параметризованный конструктор ~queue(); // деструктор void qput(int i); int qget(); >; //Определение конструктора. queue :: queue (int id) < sloc = rloc = 0; who = id; cout // Определение деструктора, queue::~queue () < cout // Занесение в очередь целочисленного значения, void queue::qput(int i) < if (sloc==100) // Извлечение из очереди целочисленного значения. int queue::qget() < if(rloc == sloc) rloc++; return q[rloc]; > int main () При выполнении эта версия программы генерирует такие результаты: Очередь 1 инициализирована. Очередь 2 инициализирована. 10 20 19 1 Очередь 2 разрушена. Очередь 1 разрушена. Как видно из кода функции main (), очереди, связанной с именем а, присваивается идентификационный номер 1, а очереди, связанной с именем b, — идентификационный номер 2. Несмотря на то что в примере с использованием класса queue при создании объекта передается только один аргумент, в общем случае возможна передача двух аргументов и более. В следующем примере объектам типа widget передается два значения. //278 //два параметра передаются конструктору #include #include class widget < int i; int j ; public: widget(int a, int b); void put_widget(); >; // Передаем 2 аргумента конструктору widget(). widget::widget(int a, int b) < i = a; j = b; >void widget::put_widget() < cout int main() < clrscr(); widget x(10, 20), y(0, 0); x.put_widget(); y.put_widget(); getch(); return 0; >Важно! В отличие от конструкторов, деструкторы не могут иметь параметров. Причину понять нетрудно: не существует средств передачи аргументов объекту, который разрушается. Если же у вас возникнет та редкая ситуация, когда при вызове деструктора вашему объекту необходимо получить доступ к некоторым данным, определяемым только во время выполнения программы, создайте для этой цели специальную переменную. Затем непосредственно перед разрушением объекта установите эту переменную равной нужному значению. При выполнении эта программа отображает следующие результаты. 10 20 0 0 Альтернативный вариант инициализации объекта Если конструктор принимает только один параметр, можно использовать альтернативный способ инициализации членов объекта. Рассмотрим следующую программу. //279 //альтернативный вариант инициализации объекта #include #include class myclass < int a; public: myclass(int x); int get_a(); >; myclass::myclass(int x) int myclass::get_a() int main () < clrscr(); myclass ob = 4; // вызов функции myclass(4) cout Здесь конструктор для объектов класса myclass принимает только один параметр. Обратите внимание на то, как в функции main() объявляется объект ob. Для этого используется такой формат объявления: myclass ob = 4; В этой форме инициализации объекта число 4 автоматически передается параметру х при вызове конструктора myclass (). Другими словами, эта инструкция объявления обрабатывается компилятором так, как если бы она была записана следующим образом. myclass ob = myclass(4); В общем случае, если у вас есть конструктор, который принимает только один аргумент, для инициализации объекта вы можете использовать либо вариант ob (х), либо вариант ob = х. Дело в том, что при создании конструктора с одним аргументом неявно создается преобразование из типа этого аргумента в тип этого класса. Помните, что показанный здесь альтернативный способ инициализации объектов применяется только к конструкторам, которые имеют только один параметр.

22.11.2019 654.34 Кб 5 Теория вероятностей.doc

15.04.2019 792.33 Кб 5 Теория вероятности 1-27 .docx

20.12.2018 24.51 Кб 0 теория организации 25-28.docx

31.07.2019 202.24 Кб 2 Теория Организации.doc

16.11.2019 267.26 Кб 0 Теория организации.doc

24.12.2018 1.61 Mб 28 Теория ответы.doc

23.08.2019 35.69 Кб 4 Теория принятия решений и управление рисками.docx

21.11.2019 33.81 Кб 3 теория систем и системного анализа.docx

16.04.2015 85.46 Кб 7 Теория управления.docx

09.11.2019 206.54 Кб 2 Теория Часть 1 2010.docx

10.11.2019 460.47 Кб 0 Теория Часть 2 2010.doc

Ограничение

Для продолжения скачивания необходимо пройти капчу:

Конструкторы в C#

Конструкторы в C#

Всем доброго времени суток. На связи Алексей Гулынин. В данной статье я бы хотел рассказать, что такое конструкторы в C#. В прошлой статье, посвященной классам в C# мы присваивали значения переменным объекта следующим образом:

Room myRoom = new Room(); //в начале создавали объект //затем инициализировали переменные myRoom.length = 7; myRoom.height = 2.5; myRoom.width = 4;

Данный способ является приемлемым, но не является оптимальным. Переменные необходимо определять в конструкторе класса .

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

уровень_доступа имя_класса() < //тело конструктора >

В качестве уровня доступа обычно используется public , так как конструктор обычно вызывается вне класса. Все классы имеют конструкторы, независимо от того, создаёте вы его или нет ( C# автоматически создаёт конструктор по умолчанию). Данный конструктор инициализирует все переменные-члены, имеющие тип значений, нулями, а переменные ссылочного типа — null значениями. Давайте создадим свой собственный конструктор, на основе предыдущего примера:

public Room()

Если мы теперь создадим объект класса Room, то его поле length (поле объекта) будет уже иметь значение, равное 7:

Room newRoom = new Room(); Console.WriteLine(newRoom.length);//выведет 7

В нашем примере использовался конструктор без параметров. А что если мы захотим изменить длину нашей комнаты. Для этого придётся написать newRoom.length = 6. Чтобы этого не делать, используются параметризированные конструкторы . Параметры вносятся в конструктор точно также, как и в метод. Давайте создадим параметризированный конструктор для нашего класса Room :

public Room(double a, double b, double c, boolean d)

Давайте теперь создадим новый объект, передав в конструктор параметры:

Room newRoom = new Room(10,3,4,true); Console.WriteLine(newRoom.length); //выведет 10

При использовании оператора new объектам динамически выделяется память из пула свободной памяти. Данный объем свободной памяти не бесконечен. Есть риск возникновения ситуации, когда память под объект не будет выделена. Поэтому в схеме динамического выделения памяти есть механизм очистки от неиспользуемых объектов. Данный процесс может выполняться вручную (например в Javascript с помощью оператора delete ). В C# за это отвечает механизм сборки мусора, который не требует участия программиста.

В языке C# можно определить метод, который будет вызываться непосредственно перед тем, когда объект будет уничтожен (т.е. когда его настигнет сборщик мусора). Этот метод называется деструктор . Синтаксис его следующий:

~имя_класса () < //тело деструктора >

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

~Room()

В качестве домашнего задания: переделайте пример из предыдущей статьи только с использованием параметризированного конструктора.

В данной статье вы узнали, что такое конструкторы в C#.

На связи был Алексей Гулынин, оставляйте свои комментарии, увидимся в следующих статьях.

C++. Классы. Часть 2. Конструктор класса. Особенности использования конструкторов в классах. Конструктор по умолчанию. Параметризированные конструкторы. Примеры классов, содержащих конструкторы

В данной теме рассматривается понятие конструктора на примере unmanaged ( native ) классов. Материалы данной темы также касаются и конструкторов managed- классов.

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

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

Класс может содержать специальные функции: конструкторы и деструкторы .

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

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

Конструктор предназначен для формирования экземпляра объекта класса. Имя конструктора класса совпадает с именем класса.

2. В какой момент работы программы осуществляется вызов конструктора класса?

Вызов конструктора осуществляется при создании объекта класса. Конструктор класса вызывается компилятором.

3. Может ли конструктор иметь параметры? Примеры конструкторов с разным количеством параметров

Конструктор может иметь любое количество параметров. Также конструктор может быть без параметров (конструктор по умолчанию).

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

Объявление класса и его методов имеет вид

// класс, который определяет дату class CMyDate < int day; int month; int year; public: // конструкторы класса CMyDate(); // конструктор без параметров CMyDate(int d, int m, int y); // конструктор с тремя параметрами // методы класса void SetDate(int d, int m, int y); // установить новую дату int GetDay(void); // возвращает номер дня int GetMonth(void); // возвращает номер месяца int GetYear(void); // возвращает год >; // реализация конструкторов и методов класса // конструктор без параметров (конструктор по умолчанию) CMyDate::CMyDate() < // установить дату 01.01.2001 day = 1; month = 1; year = 2001; > // конструктор с тремя параметрами CMyDate::CMyDate(int d, int m, int y) < day = d; month = m; year = y; >// Установить новую дату void CMyDate::SetDate(int d, int m, int y) < day = d; month = m; year = y; >// возвратить номер дня int CMyDate::GetDay(void) < return day; > // возвратить номер месяца int CMyDate::GetMonth(void) < return month; > // возвратить год int CMyDate::GetYear(void) < return year; >

Демонстрация вызова конструкторов при объявлении объектов класса

CMyDate MD1; // вызывается конструктор без параметров CMyDate MD2(4, 5, 2008); // вызывается конструктор с тремя параметрами int t; t = MD1.GetDay(); // t = 1 t = MD1.GetYear(); // t = 2001 t = MD2.GetMonth(); // t = 5 t = MD2.GetYear(); // t = 2008
4. Обязательно ли в классе описывать конструктор?

Не обязательно. При создании объекта класса, который не содержит ни одного конструктора, будет вызываться неявно заданный конструктор по умолчанию (default constructor), выделяющий память для объекта класса. Однако, в классе можно объявить собственный конструктор по умолчанию. Такой конструктор называется: явно заданный конструктор по умолчанию.

5. Что такое конструктор по умолчанию ( default constructor )? Примеры

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

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

// класс, который определяет точку на координатной плоскости class CMyPoint < int x; int y; public: // методы класса void SetPoint(int nx, int ny) < x = nx; y = ny; >int GetX(void) < return x; > int GetY(void) < return y; > >;

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

CMyPoint MP; // автоматически вызовется конструктор по умолчанию MP.SetXY(4, -10); // вызов методов класса int t; t = MP.GetY(); // t = -10

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

CMyPoint MP;

компилятор выдаст ошибку.

Пример 2. Модификация класса CMyPoint . В классе присутствует явно заданный конструктор по умолчанию.

// класс, который определяет точку на координатной плоскости class CMyPoint < int x; int y; public: // явно заданный конструктор по умолчанию CMyPoint() < x = y = 0; > // методы класса void SetPoint(int nx, int ny) < x = nx; y = ny; >int GetX(void) < return x; > int GetY(void) < return y; > >;

Демонстрация вызова явным образом заданного конструктора по умолчанию

CMyPoint MP; // вызовется явно заданный конструктор по умолчанию int t; t = MP.GetX(); // t = 0
6. Сколько конструкторов по умолчанию может иметь класс?

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

7. Может ли конструктор возвращать значение?

Конструктор не может возвращать значения (даже значение void ). Если в конструкторе написать возвращение значения с помощью оператора return , то компилятор выдаст ошибку.

8. Пример объявления и использования класса, который содержит несколько конструкторов. Реализация типа string в классе

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

Для представления внутренних членов данных в классе используется тип string . Чтобы использовать тип string в программах на Visual C++, нужно в начале модуля, который описывает класс, подключить библиотеку < string >и пространство имен std

#include using namespace std;
// Класс, который определяет общие данные о клиенте class CName < string name; // Фамилия string surname; // имя string patronymic; // отчество int age; // возраст public: CName(void); // конструктор без параметров CName(string n_name, string n_sname); // конструктор с двумя параметрами CName(string n_name, string n_sname, string n_patr); // конструктор с тремя параметрами CName(string n_name, string n_sname, string n_patr, int n_age); // 4 параметры // внутренние методы класса - реализованы в объявлении класса string GetName(void) < return name; > string GetSurname(void) < return surname; > string GetPatr(void) < return patronymic; > int GetAge(void) < return age; > ~CName(void); // деструктор >;

Реализация конструкторов и деструктора класса

// реализация конструкторов и деструктора класса // конструктор без параметров CName::CName(void) < name = «»; surname = «»; patronymic = «»; age = 0; > // конструктор с двумя параметрами CName::CName(string n_name, string n_sname) < name = n_name; surname = n_sname; patronymic = «»; age = 0; > // конструктор с тремя параметрами CName::CName(string n_name, string n_sname, string n_patr) < name = n_name; surname = n_sname; patronymic = n_patr; age = 0; >// конструктор с 4 параметрами CName::CName(string n_name, string n_sname, string n_patr, int n_age) // 4 параметра < name = n_name; surname = n_sname; patronymic = n_patr; age = n_age; >CName::~CName(void)

9. Как работает конструктор класса в случае, когда в классе объявлен объект другого класса (подобъект)? Пример
  • первым вызывается конструктор (конструкторы) класса, который есть подобъектом включающего класса;
  • следующим вызывается конструктор включающего класса.

Пример. Пусть заданы 2 класса: CMyPoint , CMyLine . В классе CMyLine есть два подобъекта класса CMyPoint . При создании объекта класса CMyLine , сначала будут вызваны 2 конструктора класса CMyPoint для двух подобъектов, а потом вызовется конструктор класса CMyLine .

// класс CMyPoint class CMyPoint < int x, y; public: CMyPoint(void); // конструктор класса >; // конструктор класса CMyPoint CMyPoint::CMyPoint(void) < // . > // класс CMyLine class CMyLine < CMyPoint p1; CMyPoint p2; public: CMyLine(void); >; // конструктор класса CMyLine CMyLine::CMyLine(void) < // . >

Объявление объекта класса CMyLine

CMyLine ML; // вызовутся: 1 - два конструктора CMyPoint(), 2 - конструктор CMyLine()

После такого объявления конструкторы вызовутся в следующей последовательности:

  • CMyPoint::CMyPoint() для объекта p1 класса CMyLine() ;
  • CMyPoint::CMyPoint() для объекта p2 класса CMyLine() ;
  • CMyLine::CMyLine() для объекта ML .
10. Как работает конструктор класса в случае, когда создается объект класса, который есть производным (унаследованным) от другого класса?

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

  • сначала вызовется конструктор базового класса;
  • следующим вызовется конструктор унаследованного класса.
11. Может ли конструктор объявляться в разделе private ?

Да, может. Такой конструктор называется приватным конструктором (private constructor).

12. В каких случаях могут создаваться приватные конструкторы?

При объявлении обычного объекта класса, конструкторы, которые размещены в разделе private (приватные конструкторы), есть недоступными.

Доступ к созданию объектов с помощью приватных конструкторов имеют:

  • методы, объявленные в классе (методы-члены класса). Сюда относятся также и статические методы, объявленные с ключевым словом static ;
  • методы дружественных классов (дружественные методы).
13. Как будет работать программа, если попробовать создать объект класса, в котором объявлен приватный конструктор по умолчанию?

В этом случае будет ошибка компиляции.

Например. Пусть задан класс CMyDate . В классе определен явно заданный конструктор по умолчанию (без параметров).

class CMyDate < private: // явно заданный конструктор по умолчанию CMyDate() < // тело конструктора // . > >

Попытка создать объект класса приведет к ошибке компиляции

CMyDate MD; // ошибка компиляции

То же самое будет, если попробовать создать статический объект

static CMyDate MDS; // ошибка компиляции также для статического объекта
14. Может ли в классе быть объявлено два конструктора, которые принимают одинаковое количество параметров?

Да, может. Однако с условием, что типы параметров будут отличаться. Для класса должно выполняться правило:

  • в классе не может быть двух методов (функций) с одинаковой (совпадающей) сигнатурой.

Этот вопрос тесно связан с темой перегрузки функций.

15. Какие конструкторы называются параметризованными?

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

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

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

  • инициализация по образцу вызова функции;
  • инициализация по образцу оператора присваивания.

Пример. Пусть задан класс, в котором определяется одна переменная n типа int . Класс имеет два конструктора. Первый – конструктор без параметров, обнуляющий значение n . Второй – конструктор с одним параметром, устанавливающий новое значение n .

Общий вид объявления класса

class CMyInt < private: int n; // количество элементов массива public: CMyInt(void) < >; // конструктор по умолчанию ~CMyInt(void); // деструктор CMyInt(int nn) < n = nn; >// конструктор с одним параметром // методы класса void SetN(int nn) < n = nn; >int GetN(void) < return n; > >;

Объявить объект класса CMyInt с использованием конструктора с 1 параметром можно двумя способами

// Демонстрация объявления объекта класса, // если в классе реализован конструктор с 1 параметром CMyInt MI1(10); // вызов конструктора с 1 параметром CMyInt MI2 = 20; // то же самое, но другим способом int t; t = MI1.GetN(); // t = 10 t = MI2.GetN(); // t = 20

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

  • Понятие класса. Объявление класса. Объект класса. Классы в среде CLR . Инкапсуляция данных в классе
  • Конструктор копирования.Примеры использования. Передача объекта класса в функцию. Возврат класса из функции

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

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