Перейти к содержимому

Сколько конструкторов может быть в классе

  • автор:

Информатика. 11 класс (Повышенный уровень)

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

В отличие от обычных методов конструкторы имеют определенные правила именования:

  • конструктор должен иметь то же имя, что и класс;
  • конструктор не имеет типа возврата.

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

В конструкторе может быть использован список инициализации полей класса. Список инициализации располагается после параметров конструктора. Он начинается с двоеточия (:), а затем значение для каждого поля указывается в круглых скобках. В теле конструктора не нужно выполнять операции присваивания, поэтому тело конструктора может быть пустым. Список инициализации членов класса не заканчивается точкой с запятой (пример 2.4).

Каждый метод класса неявно содержит в качестве поля данных указатель:

ИмяКласса * this ;

С его помощью метод класса определяет, с данными какого объекта ему предстоит работать. Указатель this можно использовать в конструкторах (пример 2.5).

Деструктор класса — еще один специальный метод — вызывается при уничтожении объекта. Имя деструктора аналогично имени конструктора, только в начале ставится знак тильды: ~. Деструктор не имеет входных параметров. Деструктор всегда один. Для простых классов (тех, которые только инициализируют значения обычных свойств) деструктор не нужен, так как C++ автоматически выполнит очистку памяти самостоятельно. Деструкторы не вызываются пользователем явно. Однако их могут безопасно вызывать другие методы класса, т. к. объект не уничтожится до тех пор, пока не выполнится деструктор.

Пример 2.3. Добавление конструкторов в класс Student.

class Student

/** поля для хранения фамилии

и названия города **/

string fam , gorod ;

/// поле — год рождения

vector < int > otm = vector < int >( 3 );

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

Student ( string f , string g , int r ,

int n0 , int n1 , int n2 );

/// метод для вычисления суммы отметок

/// сеттеры для задания значения полей

void set _ fam ( string f );

void set_gorod ( string g );

void set_god_r ( int r );

void set_otm ( vector < int > d );

/** геттер для получения строки

Фамилия Город Сумма баллов**/

Student::Student ( string f , string g ,

int r , int n0 , int n1 , int n2 )

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

void vvod1 ( vector < Student >& d )

ifstream fin ( «input.txt» );

d . resize ( r );

/** Считывание данных из файла и

определение объектов с

for ( int i = 0 ; i < r ; i ++)

string t_str , g_str ;

int b0 , b1 , b2 ;

fin >> b0 >> b1 >> b2 ;

d [ i ] = Student ( t_str , g_str ,

t_int , b0 , b1 , b2 );

Пример 2.4. Использование списка инициализации при описании конструкторов в классе Student.

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

Student () : gorod ( «Минск» ), god _ r ( 2005 ) <>

Student ( string f , string g , int r ,

int n0 , int n1 , int n2 ) :

fam ( f ), gorod ( g ),

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

Пример 2.5. Использование указателя this в конструкторе класса Date.

Date :: Date ( int t_d , int t_m , int t_g )

this -> d = t_d ;

this -> m = t_m ;

this -> g = t_g ;

Может ли в одном классе быть несколько конструкторов?

Доброго времени суток. Программируя на питоне, возникла потребность создать несколько конструкторов в одном классе. Может ли кто подсказать, есть ли такая возможность в питоне, и если есть, как правильно это реализовать. Буду особо благодарен, если кто-то сможет скинуть пример.

94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

как правильно сделать в одном запросе может быть несколько подзапросов
Народ подскажите как правильно сделать запрос SELECT id,title FROM table (IN SELECT cat.

Несколько пользовательских элементов в одном классе
Вечер добрый, Может кто-то может подсказать, как собрать несколько пользовательских элементов.

Как может быть в классе 2 одинаковых функции?
Открываю рабочий проект и там вижу такие вот строки public abstract class MainMenu .

840 / 478 / 58
Регистрация: 18.09.2012
Сообщений: 1,688

Petrol1342, вам придёться в одном конструкторе в зависимости от параметров делать то или иное. А конкретно, что вы хотите?

Регистрация: 11.09.2013
Сообщений: 22

Класс, который я пытаюсь написать, создает многомерный массив. Требуется, чтобы массив, в зависимости от данных вводимых пользователем заполнялся разными значениями: в первом случае конструктор принимает n — размерность, а далее по порядку пределы изменения индексов; во втором случае конструктор принимает размерность, а далее по порядку символьные переменные, которые этот массив заполнят. Эта конструкция взята из матлаба, там это все реализовано. Собственно, пытаемся сделать это теперь в питоне

4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570

можешь в __init__ сделать условие

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
>>> class A: . def __init__(self, *args): . a1 = args[0] . rest = args[1:] . if type(a1) == int: . self.type = 1 . self.n = a1 . self.pred = rest . elif type(a1) == tuple: . self.type = 2 . self.i, self.j = a1 . self.chars = rest . . def print(self): . if self.type == 1: . print(self.n, self.pred) . elif self.type == 2: . print(self.i, self.j, self.chars) . >>> a1 = A(2, (1, 2), (3, 4)) >>> a2 = A((2, 3), 'a', 'b') >>> >>> a1.print() 2 ((1, 2), (3, 4)) >>> a2.print() 2 3 ('a', 'b') >>>

несколько конструкторов в одном классе

Всем доброго времени суток.
Требуется написать 2 конструктора для инициализации объекта класса.
Пример:
class my
string s1;
double d1, d2;
public:
my(); //какието параметры для 1-го контруктора
my(); //какието параметры для 2-го контруктора
>;

Тоесть чтобы объект object1 класса my смог инициализироваться сразу двумя конструкторами. Или такое невозможно? Пожалуиста напишите кто знает. Заранее спасибо.

12 ответов

13 сентября 2008 года
4.8K / / 20.01.2000
14 сентября 2008 года
17 / / 31.07.2008

Мне для лабораторной работы надо. Так в задании написано.

14 сентября 2008 года
4.8K / / 20.01.2000
Мне для лабораторной работы надо. Так в задании написано.

Два конструктора могут быть, если у них различный набор параметров.

14 сентября 2008 года
17 / / 31.07.2008
Два конструктора могут быть, если у них различный набор параметров.

Это я и сам знаю, но не канает
class my
string s1;
double d1, d2;
public:
my(string); //какието параметры для 1-го контруктора
my(double, double); //какието параметры для 2-го контруктора
>;

14 сентября 2008 года
4.8K / / 20.01.2000

Это я и сам знаю, но не канает
class my
string s1;
double d1, d2;
public:
my(string); //какието параметры для 1-го контруктора
my(double, double); //какието параметры для 2-го контруктора
>;

Что значит «не канает»?
Ты понимаешь, для чего нужен конструктор и как он используется?

Ну а здесь где «какие-то» аргументы, которые ты передаешь в конструктор?

void main
my object1;
////////////////////
>

P.S. Для оформления кода ОБЯЗАТЕЛЬНО пользуйся тегами [noparse]

14 сентября 2008 года
17 / / 31.07.2008
Конструктор инициализирует объект при его создании.
Более подробно вот:

class my
string s1;
double d1, d2;
public:
my(string);
my(double, double);
>;

void main
my object1;
string str;
double num1, num2;

Пусть в объекты object1.d1 и object1.d2 класса my посылается переменные num1, num2, но не инициализируются пользователем. Допустим пользователь забыл их инициализировать. А через второй конструктор переменным object1.d1 и object1.d2 присваивается значение по умолчанию 0.0. А саму инициализацию переменных d1, d2 через object1 сделать допустим через функцию (но это мне не надо).
Думаю моя мысль понятна. Извеняюсь если че-то не правильно объяснил с точки зрения программирования. Взялся за ООП совсем недавно.

14 сентября 2008 года
4.8K / / 20.01.2000

Думаю моя мысль понятна.

Нет, совсем не понятно.

14 сентября 2008 года
17 / / 31.07.2008
Пишу весь код

class my
string s1;
double d1, d2;
public:
my(string);
my(double, double);
void set(string s, double a1, double a2)//функция для
//инициализации переменных
>;

void main
my object1;
string str;
double num1, num2;

cin>>str>>num1>>num2;
//Теперь с помощью этих переменных необходимо инициализировать s1,
//d1, d2
object1.set(str, num1, num2);
>

Допустим пользователь забыл инициализировать object1.d1 (как например работает конструктор в библиотеке , кде переменная сразу после объявления инициализируется пустым символом string s, где s=»»). Так же хочу сделать и я. Вот и все. Только вместо одноко конструктора должно быть два.

14 сентября 2008 года
4.8K / / 20.01.2000

Допустим пользователь забыл инициализировать object1.d1 (как например работает конструктор в библиотеке , кде переменная сразу после объявления инициализируется пустым символом string s, где s=»»). Так же хочу сделать и я. Вот и все. Только вместо одноко конструктора должно быть два.

«Забыл» — довольно странное выражение. 🙂
Есть так называемые конструкторы по умолчанию, без параметров.
Ты хочешь два дефолтовых конструктора, т.е. два конструктора без параметров?
Этого сделать нельзя, как нельзя написать две функции с одним названием и одинаковым набором параметров.
Да и за чем? Как ты будешь различать (определять) в своем коде, какой именно конструктор ты вызываешь, первый или второй?

14 сентября 2008 года
17 / / 31.07.2008

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

14 сентября 2008 года
3.0K / / 25.03.2003

Конструкторов — может быть сколько угодно, но они не должны совпадать набором параметров. Инициализировать переменные-члены класса — можно как угодно. Либо конструктором (или через конструктор), либо фукциями-членами класса, но конструктор вызывается при создании объекта, а функции можно вызывать в любое время после создания объекта этого класса.

14 сентября 2008 года
4.8K / / 20.01.2000

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

Ты можешь создать несколько конструкторов, среди них и дефолтовый.

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 не будет опубликован. Обязательные поля помечены *