2012-06-08 3 views
9

Я изучаю C++ и читал конструктор копий с C++: The Complete Reference. В книгах указано, чтоКопировальный конструктор с несколькими параметрами

Допускается, чтобы конструктор копирования имел дополнительные параметры, если у них есть аргументы по умолчанию, определенные для них. Однако во всех случаях первый параметр должен быть ссылкой на объект, выполняющий инициализацию.

Но я смущен тем, что мы собираемся передать эти дополнительные параметры? Я уверен, что должен быть какой-то способ, который не указан в книге и который я не могу понять. Может кто-нибудь мне помочь?

EDIT: Также возможно передать эти дополнительные параметры во всех трех случаях, то есть

  • Когда один объект явно инициализирует другой, например, в заявлении
  • Когда копия объекта сделано быть передано в функцию
  • Когда временный объект генерируется (чаще всего, в качестве возвращаемого значения)
+1

книги [Herbert Schildt_] [смотрят вниз] (http://www.seebs.net/c/c_tcn4e.html) [сообщества] (http://stackoverflow.com/questions/18385418/c-meaning- в своем заявление комбинирования-ЬурейиЙ-и-имяТип # comment26999919_18385418). Это из-за количества ошибок на каждой странице, плохой практики, которую она исповедует. [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list?rq=1) должен помочь вам выбрать хороший. – legends2k

ответ

13

Вот простой пример:

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; 

В этом примере параметра по умолчанию лжи, то есть конструктор копирования по умолчанию будет неглубоким.

A b(a_var);  // b gets a shallow copy of a 
foo(b);   // foo() receives a shallow copy 

Однако можно было бы сделать глубокую копию, передав истину во втором параметре.

A b(a_var, true); // b gets a deep copy of a 
foo(A(b, true)); // foo receives a shallow copy of a deep copy 

Аналогично для функции возвращающего A, возвращаемая копия будет неглубокой, так как он использует по умолчанию, но приемник может сделать его глубоко, когда он получает ее.

A b(bar());  // shallow 
A b(bar(), true); // deep 

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

+0

, а как насчет других 2 случаев, передавая объект функции по значению и возвращающему объекту? ... я обновил вопрос на то же самое. –

+0

@RaviGupta: спасибо за ввод, отредактирован. – jxh

1

Подумайте об этом так: существует только понятие конструктора. Когда компилятор решает, что нужно сделать копию, он ищет конструктор, который может быть вызван путем передачи в одном объекте типа T. Из-за этого специального варианта использования мы условно называем конструктором выбран конструктор «copy».

Смежные вопросы