Программирование на C и C++

Онлайн справочник программиста на C и 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 (int id)
{
sloс = rloc = 0;
who = id;
cout << "Queue " << who << " initialized.\n";
}

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

queue а = queue(101);

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

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

queue а(101)

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

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

тип_класса объект(список_аргументов);

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

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

#include <iostream.h>
// создание класса очередь
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 " << who << " initialized. \n";
}
/ / деструктор
queue::~queue()
{
cout << "Queue " << who << " destroyed. \n";
}
void queue::qput(int i)
{
if (sloс == 99) {
cout << "Queue is full. \n";
return;
}
sloc++;
q[sloc] = i;
}
int queue::qget()
{
if (rloc == sloс) {
cout << "Queue underflow. \n";
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 << a.qget() <<  " ";
cout << a.qget() <<  " ";
cout << b. qget() <<  " ";
cout << b.qget() <<  "\n";
return 0;
}

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

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

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

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

#include <iostream.h>
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 << i << " " << j << "\n";
}
int main()
{
widget x(10, 20),
y(0, 0);
x.put_widget();
у.put_widget();
return 0;
}

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