拷贝构造函数的参数是本类对象的引用。

拷贝构造函数的调用有以下三种情形:

(1)用类的一个对象去初始化另一个对象时;

(2)当函数的形参是类的对象时(值传递),如果是引用传递则不会调用;

(3)当函数的返回值是类的对象或引用时。

 

拷贝构造函数与赋值操作符的区别:

拷贝构造函数的作用是完成对未初始化存储区的初始化,而赋值操作符则是处理一个已经存在的对象。

对一个对象赋值,当它第一次出现时,调用拷贝构造函数,以后每次出现,都调用赋值操作符。

#include <iostream>
using namespace std;
class Point{
public:
    Point(int xx=0,int yy=0){x=xx;y=yy;}
    Point(Point& p);
    int getX(){return x;}
    int getY(){return y;}
private:
    int x,y;
};

Point::Point(Point& p){
    x=p.x;
    y=p.y;
    cout<<"Calling the copy constructor\n"<<endl;
}
//形参为Point类对象的函数
void fun1(Point p){
    cout<<p.getX()<<endl;
}
//返回值为Point类对象的函数
Point fun2(){
    Point a(1,2);
    return a;
}
int main(){
    Point a(4,5);
    Point b=a;             //第一种情况,初始化类的对象。'='的意义是拷贝构造而不是赋值操作符,因为没有重载赋值操作符
    cout<<b.getX()<<endl;
    fun1(b);               //第二种情况,类的对象作为函数参数。
    b=fun2();              //第三种情况,类的对象作为函数返回值。
    cout<<b.getX()<<endl;
    return 0;
}