Конструкторы могут иметь параметры. Для этого просто нужно добавить эти параметры в объявление и определение конструктора, а затем, при создании объекта, задать их в качестве аргументов. Теперь к нашим знаниям добавим еще одно - конструкторов может быть несколько.
Главный смысл перегрузки конструкторов состоит в том, чтобы предоставить программисту наиболее подходящий метод инициализации объекта.
Пример.
# include <iostream>
using namespace std;
class _3D
{
double x, y, z;
public:
_3D ();
_3D (double initX, double initY, double initZ);
};
//конструктор класса _3D с параметрами
_3D::_3D(double initX, double initY, double initZ)
{
x = initX;
y = initY;
z = initZ;
cout << "\nWhis arguments!!!\n";
}
//конструктор класса _3D без параметров
_3D::_3D()
{
x=y=z=0;
cout << "\nNo arguments!!!\n";
}
void main()
{
//создается объект A, вызывается
//конструктор без параметров
//все члены класса инициализируются нулем
//на экране надпись "No arguments!!!"
_3D A;
//создается объект B, вызывается
//конструктор c параметрами
//все члены класса инициализируются
//соответствующими переменными
//на экране надпись "Whis arguments!!!"
_3D B (3,4,0);
}
Комментарии к примеру и особенности использования.
Обратите внимание на то, что тела конструкторов описаны за пределами класса. В класс помещены только прототипы. Данная форма записи может быть использована и для обычных методов класса. Напомним, что в примерах прошлого урока тела методов описывались прямо в определении класса.
Как лучше и грамотнее, спросите вы?! Способ из прошлого урока используется для простых и коротких методов, которые в дальнейшем не предполагается изменять. Так поступают отчасти из-за того, что описания классов помещают обычно в файлы заголовков, включаемые затем в прикладную программу с помощью директивы #include. Кроме того, при этом способе машинные инструкции, генерируемые компилятором при обращении к этим функциям, непосредственно вставляются в оттранслированный текст. Это снижает затраты на их исполнение, поскольку выполнение таких методов не связано с вызовом функций и механизмом возврата, увеличивая в свою очередь размер исполняемого кода (то есть такие методы становятся inline или встраиваемыми).
Cпособ, используемый в описанном выше примере, предпочтительнее для сложных методов. Объявленные таким образом функции автоматически заменяются компилятором на вызовы подпрограмм.