复制构造函数参数

har*_*ris 7 c++ copy-constructor

在复制构造函数中,为什么参数需要具有与之关联的默认值?如果没有与它们关联的默认值并且构造函数中提供了多个参数,会发生什么?

例如:

X(const X& copy_from_me, int = 10);
Run Code Online (Sandbox Code Playgroud)

有一个int的默认值,但是:

X(const X& copy_from_me, int);
Run Code Online (Sandbox Code Playgroud)

才不是.在第二种情况下会发生什么?

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

Alo*_*ave 10

复制构造函数总是接受一个参数,引用它所属的类型,可能还有其他参数,但它们必须具有默认值.

复制构造函数被称为复制函数,复制构造函数的目的是通过使用相同类型的对象作为创建新类型的基础来创建类型的对象.

标准指定复制构造函数的类型:

T(const &T obj);
Run Code Online (Sandbox Code Playgroud)

这基本上允许在通过值调用函数期间创建临时对象,或者按值返回类型的对象.
此语法有助于创建新对象,如下所示:

T obj1(obj2);      <--------- Direct Initialization
T obj1 = obj2;     <--------- Copy Initialization
Run Code Online (Sandbox Code Playgroud)

如果传递给复制构造函数的附加参数不会被强制要求具有默认值,那么使用上述语法构造对象将是不可能的.
因此,严格的条件,
可能其它参数拷贝构造函数,但他们必须有默认值.


NPE*_*NPE 9

当调用复制构造函数时,唯一可以保证可用的是对同一个类的实例的引用.如果复制构造函数接受超出此必需引用的参数,则这些参数必须具有默认值.

假设我们有一个带有以下签名的构造函数:

 X(const X&, int);
Run Code Online (Sandbox Code Playgroud)

由于第二个参数,这不能用作复制构造函数.例如:

 X x1;
 X x2(x1);
Run Code Online (Sandbox Code Playgroud)

编译器如何使用上面的构造函数x2?它不能.

另一方面,以下可以用作复制构造函数:

 X(const X&, int = 0);
Run Code Online (Sandbox Code Playgroud)