复制构造函数的调用

164 阅读1分钟

【C++】复制构造函数的调用

复制构造函数调用的三种情况:

  1. 初始化
class Point {
	public :
		Point (int xx,int yy):x(xx),y(yy){
			cout<<"调用Point构造函数"<<endl; 
		}

		Point(Point &p){  //本篇核心:Point类的复制构造函数
			x=p.x;
			y=p.y;
			cout<<"调用Point复制构造函数"<<endl; 
		}
		
	private:
		int x;
		int y;
};

Point p1(3,4);
Point p3(p1);   //给p3初始化
Point p1 = p3;  //另一种初始化方式
  1. 向函数体传递子对象
class Line {        //定义一个Line类,Point是它的子对象 
	public :
		Line(Point p11,Point p22):p1(p11),p2(p22){
            cout<<"调用Line构造函数"<<endl;
        };
		
	private:
		Point p1;
		Point p2;
};

Line(p1,p2);   //调用Line的构造函数给p1 p2初始化

这时会发现,明明就给两个子对象初始化,却调用了四次复制构造函数。

这是因为在调用Line的构造函数过程中,需要将外面的p1和p2先传给函数体内部的p11和p22形参,这时也会触发Point类的复制构造函数。

  1. 函数体返回子对象
Point f(){
	Point p4(4,5);
	return p4;   //返回子对象时调用
}
int main(){
	Point a(0,0) ;
	a=f();    //初始化时调用
}

总结:

除了简单的赋值以外, 无论是子对象进入函数体,还是函数体返回子对象,都会调用一遍复制构造函数。 即:实参—>形参 形参—>实参。