скопировать параметры конструктора

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

Например:

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

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

X(const X& copy_from_me, int);

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

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


person haris    schedule 30.01.2012    source источник
comment
X(const X& copy_from_me, int = 10); что если я напишу X(const X& copy_from_me, int);   -  person haris    schedule 30.01.2012
comment
+1 за интересный вопрос, в следующий раз вам следует приложить немного больше усилий к презентации :)   -  person John Humphreys    schedule 30.01.2012
comment
Этот второй параметр не имеет абсолютно никакого отношения к конструкторам копирования.   -  person Chris Eberle    schedule 30.01.2012


Ответы (4)


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

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

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

T(const &T obj);

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

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

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

person Alok Save    schedule 30.01.2012

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

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

 X(const X&, int);

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

 X x1;
 X x2(x1);

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

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

 X(const X&, int = 0);
person NPE    schedule 30.01.2012

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

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

person Bo Persson    schedule 30.01.2012

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

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

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

person Mike Seymour    schedule 30.01.2012