Конструктор копирования должен быть в одной из следующих форм:
T(T&);
T(const T&);
То есть конструктор является конструктором копирования * только 1007 * если он принимает один параметр типа ссылочного класса.Конструктор, который принимает один параметр типа класса по значению, по определению не является конструктором копирования (правка) - и фактически является недопустимым, как указано в Cat Plus Plus.
12.1: Конструкторы
10 / Конструктор копирования для класса X - это конструктор с первым параметром типа X & или типа const X &
Однако за пределами этого стандартафундаментальная ошибка в вашем понимании конструктора копирования.Рассмотрим следующий код:
class Foo
{
public:
Foo() {}
Foo(Foo f) {/*...*/};
};
int main()
{
Foo f1;
Foo f2(f1);
}
Когда создается f2
, f1
передается по значению.Чтобы оценить параметры для вызова конструктора, необходимо скопировать f1
.Итак, вы видите, что здесь есть парадокс.Чтобы вызвать конструктор копирования, вы должны сделать копию.Чтобы сделать копию, вы должны вызвать конструктор копирования ...
Выше необходимо вызвать конструктор с аргументом by-value просто потому, что это тип параметра , равный : это Foo
по значению.Если бы это было не по значению, это должно быть либо по ссылке, которая выглядит так:
Foo(Foo& rhs)
/* or like this: */ Foo(const Foo& rhs);
... или она должна принимать это по указателю, который выглядит так:
Foo(Foo* prhs)
... но в последнем случае это, очевидно, не конструктор копирования, учитывая приведенное выше определение.