Ответ 1
Передача по значению означает, что параметр скопирован в функцию. Это вызывает конструктор копирования.
Если ваш конструктор конструктора экземпляров имеет значение pass-by-value... Он будет называть себя... снова и снова...
Возможный дубликат:
Почему конструктор копирования принимает свой параметр по ссылке в С++?
Может ли объект передаваться как значение конструктору копирования
Рассмотрим этот фрагмент кода:
class complex{
private:
double re, im;
public:
complex(double _re, double _im):re(_re),im(_im){}
complex(complex c):re(c.re),im(c.im){}
};
При компиляции я получил сообщение об ошибке: invalid constructor; you probably meant ‘complex (const complex&)’
В книге C++ Programming Language
написано, что:
Конструктор копирования определяет, какие средства копирования - включая копирование аргумента означает, что запись
complex: complex (complex c): re (c.re), im (c.im) {}//ошибка
- ошибка, потому что любой вызов включал бы бесконечную рекурсию.
Почему это приводит к бесконечной рекурсии? Это не имеет смысла.
Передача по значению означает, что параметр скопирован в функцию. Это вызывает конструктор копирования.
Если ваш конструктор конструктора экземпляров имеет значение pass-by-value... Он будет называть себя... снова и снова...
Передача по значению (а не по ссылке) означает, что нужно сделать копию. Таким образом, переход по значению в ваш конструктор копирования означает, что вам нужно сделать копию до того, как будет создан конструктор копирования, но для создания копии вам сначала нужно вызвать конструктор копирования.
Когда функция передается с параметром, создается локальная переменная, соответствующая параметру, и копируется с аргументом, переданным вызову функции. Следовательно, когда вызывается функция, будет вызываться конструктор копирования функции, чтобы скопировать аргумент, переданный вызову, в созданную локальную переменную. Это приводит к бесконечному циклу.
Где, как при передаче ссылки на функцию, локальная переменная не создается в соответствии с параметром.