在复制构造函数中,为什么参数需要具有与之关联的默认值? 如果没有与它们关联的默认值并且构造函数中提供了多个参数,会发生什么?
例如:
X(const X& copy_from_me, int = 10);
有一个int的默认值,但是:
X(const X& copy_from_me, int);
没有。在第二种情况下会发生什么?
答案 0 :(得分:10)
复制构造函数总是接受一个参数,引用它所属的类型,可能其他参数但是必须具有默认值。
复制构造函数被称为复制函数,复制构造函数的目的是通过使用相同类型的对象作为创建新类型的基础来创建类型的对象。
标准指定复制构造函数的类型为:
T(const &T obj);
这基本上允许在通过值调用函数期间创建临时对象,或者按值返回类型的对象 此语法有助于创建新对象:
T obj1(obj2); <--------- Direct Initialization
T obj1 = obj2; <--------- Copy Initialization
如果传递给复制构造函数的附加参数没有强制要求使用默认值,那么使用上述语法构造对象是不可能的。
因此严格的条件,
可能复制构造函数的其他参数,但必须具有默认值。
答案 1 :(得分:9)
当调用复制构造函数时,唯一可以保证可用的是对同一个类的实例的引用。如果复制构造函数接受超出此必需引用的参数,则这些参数必须具有默认值。
假设我们有一个带有以下签名的构造函数:
X(const X&, int);
由于第二个参数,它不能用作复制构造函数。例如:
X x1;
X x2(x1);
编译器如何使用x2
的上述构造函数?它不能。
另一方面,以下可以用作复制构造函数:
X(const X&, int = 0);
答案 2 :(得分:3)
复制构造函数有一个参数,它是对复制类型的引用。
可以有其他参数,如果这些参数有默认值。如果它们没有默认值,则它不是复制构造函数。
答案 3 :(得分:1)
复制构造函数必须只能使用要复制的类型的对象来调用:
Thing t1; // default constructor
Thing t2(t1); // copy constructor
如果有没有默认值的额外参数,则不能像这样调用构造函数,因此它不是复制构造函数。