【C++】复制构造函数的调用
复制构造函数调用的三种情况:
- 初始化
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; //另一种初始化方式
- 向函数体传递子对象
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类的复制构造函数。
- 函数体返回子对象
Point f(){
Point p4(4,5);
return p4; //返回子对象时调用
}
int main(){
Point a(0,0) ;
a=f(); //初始化时调用
}
总结:
除了简单的赋值以外, 无论是子对象进入函数体,还是函数体返回子对象,都会调用一遍复制构造函数。 即:实参—>形参 形参—>实参。