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