Третий конструктор называется конструктором копирования (см. п. п. 12.1/10 в [1]). Такой конструктор копирует поля уже существующего объекта в поля объявляемого. Объект передается конструктору в качестве параметра. Для нашего класса TMoney он мог бы быть таким, как показано в листинге 2.2.
Листинг 2.2. Конструктор копирования
TMoney::TMoney(const TMoney &г) { *this = г: }
Обратите внимание на то, что параметр передается по ссылке — передавать по значению нельзя! Попробуем объявить заголовок в классе:
TMoney(CQnst TMoney г);
Даже без реализации просто при объявлении заголовка в классе с параметром, передаваемым по значению, Visual C++.NET 2003 выдает сообщение об ошибке С2652:
'TMoney' : illegal copy constructor: first parameter must not be a 'TMoney'
Это сообщение говорит о недопустимости такого конструктора копирования — его первый параметр не должен иметь тип TMoney.
Аналогичное сообщение выдает и С++ Builder 6.
Вообще-то параметр необязательно должен быть константным, достаточно, чтобы он передавался по ссылке. Конструктор копирования, приведенный в листинге 2.2, обычно создается системой по умолчанию, если только не определен программистом явно. Однако мы можем объявить собственный конструктор с параметром, передаваемым по неконстантной ссылке. Более того, в классе может быть объявлено несколько конструкторов копирования, и стандарт (см. п. 12.8 в [1]) разрешает определять несколько параметров, если им присваивается значение по умолчанию, например:
class X
{ //...
public: X(int t):
X(X &t, int r = 0); // ...
// конструктор инициализации // конструктор копирования
}
X а(1): X b(a,2); X d = b;
// работает конструктор инициализации // работает конструктор копирования // работает конструктор копирования
|