2012-01-30 237 views
5

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

例如:

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

有整型的默认值,但这样的:

X(const X& copy_from_me, int); 

没有。第二种情况会发生什么?

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

+0

你是什么意思? – kennytm 2012-01-30 15:13:23

+0

X(const X&copy_from_me,int = 10);如果我写X(const X&copy_from_me,int); – haris 2012-01-30 15:16:56

+1

对于这个有趣的问题,你应该在下次的演讲中多加一点努力:) – 2012-01-30 15:22:08

回答

9

拷贝构造函数总是需要一个参数,参照用于其所属,有也许其他参数,但他们必须默认值的类型。

一个拷贝构造函数被调用作为复印功能和拷贝构造的目的是通过使用相同的类型作为创建新类型的基础的一个目的是创建一个类型的对象。

标准规定的是拷贝构造函数是类型:

T(const &T obj); 

这基本上允许按值调用函数或返回值的类型的对象时临时对象的创建。如果被传递到拷贝构造函数的其他参数

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

不会被授权有默认值,然后使用上述语法是不可能的对象的构造:
这句法有利于建立一个新的对象作为。
因此,严格的条件,
也许其它参数拷贝构造函数,但他们必须默认值。

9

当调用拷贝构造函数,这是保证是唯一可用的东西是同一类的实例的引用。如果复制构造函数的参数超出此必需的引用,那些参数必须具有默认值。

比方说,我们有以下签名的构造函数:

X(const X&, int); 

这不能作为一个拷贝构造函数,因为第二个参数。例如:

X x1; 
X x2(x1); 

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

在另一方面,下面的可以被用作复制构造:

X(const X&, int = 0); 
+0

+1不止一个班轮! – ezdazuzena 2012-01-30 15:24:22

1

复制构造必须是可调用与刚刚所述类型的一个目的是要复制:

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

如果没有默认值的额外参数,那么构造函数不能像这样调用,所以它不是一个复制构造函数。

3

复制构造函数具有一个参数,该参数是对所复制类型的引用。

可以有附加参数,如果这些有默认值。如果他们没有默认值,它只是不是一个复制构造函数。