class Sample
{
public:
Sample(){}
Sample(const Sample& obj){ cout<<"C.C. with 1 argument called"<<endl;}
Sample(const Sample& obj, int i){ cout<<"C.C. with 2 arguments called"<<endl;}
};
void main()
{
Sample s1;
Sample s2 = s1; // Here, C.C with 1 arg. called.
}
问题很少:
- 如何调用复制具有2个参数的构造函数?
- 当我们需要一个带有1个参数的复制构造函数时,以及何时需要带有2个参数的C.C?
醇>
答案 0 :(得分:7)
具有2个(或更多)必需参数的构造函数不是复制构造函数。
1:
Sample s2(s1, 0);
答案 1 :(得分:4)
在这里添加一点形式主义。标准对“复制构造函数”一词(12.8)有严格的定义:
A non-template constructor for class X is a copy constructor if its first parameter is of type X&, const X&,
volatile X& or const volatile X&, and either there are no other parameters or else all other parameters
have default arguments (8.3.6). [ Example: X::X(const X&) and X::X(X&,int=1) are copy constructors.
答案 2 :(得分:2)
一个类只有一个副本ctor,只能用一个参数调用。它可以采用两个(或更多)参数,但前提是它为其他参数提供默认值。无论哪种方式,第一个参数必须是对同一类型的对象的(通常是const)引用。
你的第二个ctor采用两个参数并不是真正的复制ctor(至少通常使用这个术语) - 它只是一个碰巧将一个实例作为参数的ctor(可能是基于该参数的新实例) ,至少部分)。