什么是复制构造函数:
复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性 ,它的形参是本类的对象的引用,比如(类名 对象名)。它的作用是使用一个已经存在的对象(此对象由复制构造函数的参数决定),去初始化同类的一个新对象。那么复制构造函数一般在什么情况下被调用呢,有三种情况:
(1)当用类的一个对象去初始化该类的另一个对象的时候
例: int main()
{
Point a(1,2); // 调用类的构造函数(Point类)
Point b(a); // 用已存在的对象a初始化新对象b,复制构造函数被调用
Point c=a; // 用已存在的对象a初始化新对象c,复制构造函数被调用
return 0;
}
(2)如果函数的形参是类的对象,调用此函数的时候,进行形参和实参相结合时,复制构造函数被调用
例: void f(Point p)
{
cout<<p.getX()<<endl;
}
int main()
{
Point a(1,2);
f(a); // 函数的形参为类的对象,当调用函数时,实参与形参结合,复制构造函数被调用
return 0;
}
注意:只有把对象用值传递的时候,才会调用复制构造函数,如果传递引用,则不会调用复制构造函数。
(3)如果函数的返回值是类的一个对象,函数执行完成返回调用者时,复制构造函数被调用
例: Point g()
{
Point a(1,2);
return a; // 函数的返回值是类的对象a,返回函数值时,复制构造函数被调用
}
int main()
{
Point b;
b=g();
return 0;
}
注意:这种情况下,表面上函数g将a返回给了主函数,但是a是g()的局部对象,离开建立他的函数g以后a就不存在了,不可能在返回给主函数后继续生存,所以在处理这种情况的时候编译器系统会在主函数中创建一个无名的临时对象,该临时对象的生存期只在函数调用所处的表达式中,也就是表达式 b=g() 中。执行语句“ return a ”时,实际上是调用复制构造将a的值复制到临时对象中,所以在此调用了复制构造函数。函数g运行结束时对象a消失,但临时对象会存在于表达式“ b=g()”中。计算完这个表达式后,临时对象的任务也就完成了,改临时对象就会自动消失。
以上便是复制构造函数经常被调用的三种情况。下面我写一下类Point,便于大家参考。
class Point
{
public:
Point (int xx=0, int yy=0) // 构造函数,带有形参
{
x=xx; y=yy;
}
Point (Point &p); // 复制构造函数
int getX() { return x; }
..........
private:
int x , y;
};
Point::Point(Point &p) // 复制构造函数实现
{
x=p.x;
y=p.y;
}