Пара слов о конструкторах в C++

30 августа 2011 г.

Конструктор в классе — вещь нужная. В C++ мы имеем, на первый взгляд, необоснованные запреты. В частности, класс вида:

class MyClass {
public:
MyClass(MyClass initialClass);
//...
protected:
//...
private
//...
};

компилироваться не будет.

MSVC++ выдаст error, GCC выдаст error и намекнет на возможную замену «MyClass(MyClass initialClass)» на «MyClass(const MyClass& initialClass)». Квалификатор «const» здесь, на самом деле, излишний, но поставить его стоит. Это, как известно, намекнет и вам, и вашим преемникам, что в этой функции данная переменная является немодифицируемой

Возникает вопрос: «Что не так-то, ё-маё?!» А ответ на поверхности. При вызове конструктора MyClass(MyClass initialClass), мы на самом деле просто создаем переменную initialClass и инициализируем её переданным в функцию значением. Однако такая инициализация требует конструктора, который бы умел создавать из переменной типа MyClass, новую переменную типа MyClass, который мы как раз определяем.
Что получается?
Бесконечная рекурсия.

Вариант для любителей указателей(по квалификаторам я, может быть, хватанул лишка):

MyClass(const MyClass* const initialClass);

И для любителей ссылок:

MyClass(const MyClass& initialClass);

Вот тут всё правильно.

Теги:
рубрика Программирование
  • Похожие статьи
  • Предыдущие из рубрики