2012-01-06 4 views
2

Можно создать дубликат:
Why should the copy constructor accept its parameter by reference in C++?
Why is copy constructor not allowed pass by value?Конструкторы копирования

Я чтении лекций для моего класса на C++. В примечаниях они говорят, что конструктор копирования подпись для класса

MyClass (MyClass & других)

и

MyClass (MyClass другого)

воны Не работай. Почему это?

Спасибо!

+1

Точно, что делает конструктор копирования? Что именно происходит при вызове 'MyClass (MyClass other)'? –

+0

Не забудьте 'const'. Лучшей сигнатурой для конструктора копии является 'MyClass (const MyClass & other)'. –

+0

На самом деле, контур копирования должен быть 'MyClass (const MyClass & other)'. –

ответ

15

Потому что MyClass(MyClass other) передает параметр по значению, который сам требует создания копии. Это приведет к бесконечному циклу (завершается только при переполнении стека).

+0

Спасибо вам большое! –

3

Это связано с тем, что для того, чтобы передать экземпляр MyClass other конструктору со второй сигнатурой, конструктор должен был бы назвать себя, что привело бы к бесконечному перепроизводству, ведущему к переполнению стека.

Попробуйте, это очень поучительное упражнение!

+0

Спасибо ......... :) –

2

MyClass(MyClass other) Проходит other копией, которая будет ссылаться на созданный вами экземпляр копирования, таким образом, вы закончите бесконечную рекурсию.

1

MyClass(MyClass other) уже создает копию other, потому что вы передаете параметр other, как переменная не как ссылки, поэтому конструктор копии в этом случае не будет иметь смысла

1

Правильные подписи конструктор копирования являются

MyClass(MyClass &other) MyClass(const MyClass &other) MyClass(MyClass const &other)

В C++ все параметры функции передаются по значению. Это означает, что если вы пройдете other по значению, он будет уничтожен после завершения операции вызова оператора. Кроме того, в случае выполнения конструктора копирования выполняется бесконечный цикл выполнения конструктора копии. Таким образом, параметр конструктора копирования всегда передается по ссылке.

+0

Второе два идентичны ... –

+0

Да. Они идентичны от компилятора POV, но не от человека :) Итак, пусть оба они будут для новичков. – DaddyM

+0

Что такое "const?" –