Конструктор копирования с несколькими параметрами
Я изучаю C++ и читал конструктор копирования из C++: The Complete Reference. В книгах говорится, что
Конструктору копирования разрешается иметь дополнительные параметры, если для них определены аргументы по умолчанию. Однако во всех случаях первым параметром должна быть ссылка на объект, выполняющий инициализацию.
Но меня смущает, как мы собираемся передавать эти дополнительные параметры? Я уверен, что должен быть какой-то способ, который не дается в книга и которую я не могу понять. Кто-нибудь может мне помочь?
Редактировать:
Также можно ли передать эти дополнительные параметры во всех трех случаях, т. е.
- когда один объект явно инициализирует другой, например, в объявлении
- когда копия объекта создается для передачи функции
- когда временный объект генерируется (чаще всего, как возвращаемое значение)
2 ответов:
Вот простой пример:
class A { //... public: A (const A&, bool deep = false) { if (!deep) { /* make a shallow copy */ } else { /* make a deep copy */ } } }; void foo (A x) { /*...*/ } A bar () { /*...*/ return A(); } A a_var;В этом примере параметру по умолчанию присвоено значение false, что означает, что конструктор копирования по умолчанию будет пустым.
A b(a_var); // b gets a shallow copy of a foo(b); // foo() receives a shallow copyОднако можно было бы произвести глубокую копию, передав true во втором параметре.
Аналогично, для функции, возвращающейA b(a_var, true); // b gets a deep copy of a foo(A(b, true)); // foo receives a shallow copy of a deep copyA, возвращаемая копия будет неглубокой, так как она использует значение по умолчанию, но получатель может сделать ее глубокой, когда он ее получает.A b(bar()); // shallow A b(bar(), true); // deepПомните, когда вы определение конструктора копирования, скорее всего, означает, что вам нужно будет определить деструктор и перегрузить оператор присваивания (правило трех).
Подумайте об этом так: существует только понятие конструктора. Когда компилятор решает, что копия должна быть сделана, он ищет конструктор, который может быть вызван путем передачи одного объекта типа
T. Из-за этого особого случая использования мы условно называем выбранный конструктор конструктором "copy".
Comments