копировать параметры конструктора - PullRequest
7 голосов
/ 30 января 2012

В конструкторе копирования почему аргументы должны иметь значения по умолчанию, связанные с ними? Что произойдет, если с ними не связаны значения по умолчанию и в конструкторе указано более одного аргумента?

Например:

X(const X& copy_from_me, int = 10);

имеет значение по умолчанию для int, но это:

X(const X& copy_from_me, int);

нет. Что происходит во втором случае?

http://en.wikipedia.org/wiki/Copy_constructor

Ответы [ 4 ]

10 голосов
/ 30 января 2012

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

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

Стандарт определяет, что конструктор копирования имеет тип:

T(const &T obj);

Это в основном позволяет создавать временные объекты во время вызова функций по значению или возвращать объекты типа по значению.
Этот синтаксисоблегчает создание нового объекта как:

T obj1(obj2);      <--------- Direct Initialization
T obj1 = obj2;     <--------- Copy Initialization

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

9 голосов
/ 30 января 2012

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

Допустим, у нас есть конструктор со следующей подписью:

 X(const X&, int);

Это нельзя использовать в качестве конструктора копирования из-за второго аргумента. Например:

 X x1;
 X x2(x1);

Как компилятор использует вышеуказанный конструктор для x2? Не может.

С другой стороны, следующий может использоваться в качестве конструктора копирования:

 X(const X&, int = 0);
3 голосов
/ 30 января 2012

Конструктор копирования имеет один параметр, который является ссылкой на тип копируемого типа.

Он может иметь дополнительные параметры, , если , они имеют значения по умолчанию.Если у них нет значений по умолчанию, это просто не конструктор копирования.

1 голос
/ 30 января 2012

Конструктор копирования должен вызываться только объектом копируемого типа:

Thing t1;     // default constructor
Thing t2(t1); // copy constructor

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

...