Инструменты пользователя

Инструменты сайта


peregruzhennye_konstruktory

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

peregruzhennye_konstruktory [2019/04/14 11:02]
peregruzhennye_konstruktory [2020/06/13 13:46] (текущий)
Строка 1: Строка 1:
 +====== Перегруженные конструкторы C++ ======
 +Конструкторы могут иметь параметры. Для этого просто нужно добавить эти параметры в объявление и определение конструктора, а затем, при создании объекта, задать их в качестве аргументов. Теперь к нашим знаниям добавим еще одно - конструкторов может быть несколько.
  
 +Главный смысл перегрузки конструкторов состоит в том, чтобы предоставить программисту наиболее подходящий метод инициализации объекта.
 +<note> В отличие от конструктора, деструктор не может быть перегружен, так как не имеет параметров. Это вполне логично, поскольку отсутствует механизм передачи параметров удаляемому объекту.
 +</note>
 +**Пример.**
 +<file>
 +# 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); 
 +}
 +</file>
 +
 +**Комментарии к примеру и особенности использования.**
 +  - Каждому способу объявления объекта класса должна соответствовать своя версия конструкторов класса. Если это не будет обеспечено, то при компиляции программы обнаружится ошибка на этапе компиляции.
 +  - На этом примере легко понять, чем может быть вызвана необходимость перегрузки конструкторов.(именно перегрузки, поскольку речь здесь идет о функциях, имеющих одинаковые имена, но различные списки параметров) Итак, главный смысл перегрузки конструкторов состоит в том, чтобы предоставить программисту наиболее подходящий метод инициализации объекта.
 +  - В примере представлен наиболее распространенный вариант перегрузки конструкторов, т.е. конструктор без параметров и конструктор с параметрами. Как правило, в программе бывают необходимы оба эти вида, поскольку конструктор с параметрами более удобен при работе с одиночными объектами, но не может использоваться при инициализации объектов-элементов динамического массива.
 +  - Хотя конструктор можно перегружать столько раз, сколько захотите, лучше не стоит этим злоупотреблять. Конструктор стоит перегружать лишь для наиболее часто встречающихся ситуаций. 
 +
 +====== Полезная информация ======
 +Обратите внимание на то, что тела конструкторов описаны за пределами класса. В класс помещены только прототипы. Данная форма записи может быть использована и для обычных методов класса. Напомним, что в примерах прошлого урока тела методов описывались прямо в определении класса. 
 +
 +Как лучше и грамотнее, спросите вы?! Способ из прошлого урока используется для простых и коротких методов, которые в дальнейшем не предполагается изменять. Так поступают отчасти из-за того, что описания классов помещают обычно в файлы заголовков, включаемые затем в прикладную программу с помощью директивы #include. Кроме того, при этом способе машинные инструкции, генерируемые компилятором при обращении к этим функциям, непосредственно вставляются в оттранслированный текст. Это снижает затраты на их исполнение, поскольку выполнение таких методов не связано с вызовом функций и механизмом возврата, увеличивая в свою очередь размер исполняемого кода (то есть такие методы становятся inline или встраиваемыми). 
 +
 +Cпособ, используемый в описанном выше примере, предпочтительнее для сложных методов. Объявленные таким образом функции автоматически заменяются компилятором на вызовы подпрограмм.