У C++,
конструктори, як правило, повинні приймати свій аргумент за посиланням щоб уникнути непотрібного копіювання об'єктів. Якщо аргумент передається за значенням, конструктор копіювання викликається рекурсивно, щоб створити копію аргументу, що призведе до нескінченного циклу та переповнення стеку. 1 травня 2023 р.
Необхідно передати об'єкт як посилання, а не за значенням, оскільки якщо ви передаєте його за значенням, його копія створюється за допомогою конструктора копіювання. Це означає, що конструктор копіювання викличе сам себе, щоб створити копію. Цей процес триватиме до тих пір, поки компілятор не закінчить пам'ять.
Згідно з конструктором копіювання C++, ми передаємо об’єкт за посиланням на функцію копіювання Object() { [власний код] }, і ми зазвичай передаємо його як константне посилання. Одне з обґрунтувань передачі посилання const полягає в тому, що воно може використовувати const усюди, де це можливо в C++ щоб уникнути ненавмисної зміни об'єктів.
Отже, щоб запобігти проблемам з пошкодженням пам'яті Посиланням надається перевага, ніж покажчикам. Таким чином, вихідний об’єкт, який передається, ніколи не змінюється в конструкторі копіювання та використовується виключно для цілей лише для читання. Як уже сказав Стефан: посилання бувають постійними та неконстантними.
Якщо ви передаєте об’єкт за значенням у конструкторі копіювання, це призведе до рекурсивного виклику самого конструктора копіювання. Це відбувається тому, що передача за значенням передбачає створення копії, а створення копії включає виклик конструктора копіювання, що призводить до нескінченної рекурсії. Використання посилання дозволяє уникнути цієї рекурсії.
Коли ми створюємо власний конструктор копіювання, ми передаємо об’єкт за посиланням і зазвичай передаємо його як константне посилання. Однією з причин передачі посилання const є те, що ми повинні використовувати const у C++, де це можливо щоб об’єкти не були випадково змінені.