拷贝构造函数(复制构造函数)
拷贝构造函数被调用的三种情况:
(1) 一个对象以值传递的方式进入函数体,即函数的形参是类的对象(而非对象的引用),调用函数时,发生复制构造。
(2) 一个对象以值传递的方式从函数返回,即函数的返回值是类的对象,函数执行完成返回主调函数时,发生复制构造。
(3)一个对象用另一个对象初始化。
举例说明:
#include<iostream>
#include<math.h>
using namespace std;
class Point
{
private:
int x, y;
public:
Point();
Point(int xx, int yy);
Point(Point &p);
int get_x();
int get_y();
};
Point::Point()
{
cout << "调用Point的构造函数1" << endl;
}
Point::Point(int xx, int yy)
{
cout << "调用Point的构造函数2" << endl;
x = xx;
y = yy;
}
Point::Point(Point &p)
{
cout << "调用Point的拷贝构造函数" << endl;
x = p.x;
y = p.y;
}
int Point::get_x()
{
return this->x;
}
int Point::get_y()
{
return this->y;
}
class Line
{
private:
Point p1, p2;
double len;
public:
Line(Point xp1, Point xp2);
Line(Line &l);
double get_Len();
};
//组合类的构造函数
Line::Line(Point xp1, Point xp2):p1(xp1),p2(xp2)
{
cout << "调用Line的构造函数" << endl;
double x = p1.get_x() - p2.get_x();
double y = p1.get_y() - p2.get_y();
len = sqrt(x*x + y * y);
}
//组合类的拷贝构造函数
Line::Line(Line &l):p1(l.p1),p2(l.p2)
{
cout << "调用Line的拷贝构造函数" << endl;
len = l.len;
}
double Line::get_Len()
{
return this->len;
}
int main()
{
Point myp1(1, 1), myp2(4, 5);
Line line1(myp1, myp2);
Line line2(line1);
cout << "线段的长度是:"<<endl;
cout << line1.get_Len()<<endl;
cout << line2.get_Len()<<endl;
return 0;
}
执行结果如下:
结果分析:
从结果中看出,函数参数是对象时,发生复制构造,执行结果为第三句,第四句。函数参数是对象引用时,则不发生复制构造,从Line的拷贝构造函数执行结果可以看出来。
若Line的构造函数是这样写
Line::Line(Point xp1, Point xp2)
{
p1=xp1;
p2=xp2;
cout << "调用Line的构造函数" << endl;
double x = p1.get_x() - p2.get_x();
double y = p1.get_y() - p2.get_y();
len = sqrt(x*x + y * y);
}
执行结果如下:
则执行Line的构造函数时,给Line的p1,p2进行初始化时会调用默认构造函数。