谁能解释下面C++这个简单程序

来源:百度知道 编辑:UC知道 时间:2024/05/29 10:01:33
#include<iostream.h>
#include<cmath>
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<<"Point拷贝构造函数被调用"<<endl;
}
class Line
{public:
Line(Point xp1,Point xp2);
Line(Line&);
double GetLen(){return len;}
private:
Point p1,p2;
double len;
};
Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2)
{cout<<"Line构造函数被调用"<<endl;
double x=double(p1.GetX()-p2.GetX());
double y=double(p1.GetY()-p2.GetY());
len=sqrt(x*x+y*y);}
Line::Line(Line&L):p1(L.p1),p2(L.p2)
{
cout<<"Line拷贝构造函数被调用"<<endl;
len=L.len;
}
int main()
{Point myp1(1,1),myp2(4,5);
Line line(myp1,myp2);
Line line2(line);
cout<

第一二个“Point拷贝构造函数被调用 ”的输出是因为函数Line line(myp1,myp2); 的调用没有使用引用参数的形式,函数运行时会复制myp1,myp2这两个变量的值至函数内部变量xp1,xp2中。
第三四个“Point拷贝构造函数被调用 ”是因为
Line::Line(Point xp1,Point xp2):p1(xp1),p2(xp2)冒号后的语句在调用拷贝构造函数把函数内变量的值赋给类成员变量。
第五个“Line构造函数被调用”是因为什么我想不用说了。
后面的三个顺序
Line::Line(Line&L):p1(L.p1),p2(L.p2)
{
cout<<"Line拷贝构造函数被调用"<<endl;
len=L.len;
}
你看上面的函数实现应该也能理解了,和上面的是一样的。

Point myp1(1,1),myp2(4,5); // 这里调用Point(int xx=0,int yy=0)默认构造初始化myp1,myp2 //(point一次)

Line line(myp1,myp2); //调用line构造函数时(line 构造一次),因为是point类的myp1,和myp2做函数参数的传值,必然是调用Point拷贝构造函数//(point一次),p1(xp1),p2(xp2)是对象初始化对象也调用Point拷贝构造函数,(两个对象,分别调用point两次)//
Line line2(line); //调用拷贝构造函数Line::Line(Line&L)(line 拷贝一次),;时,p1(L.p1),p2(L.p2)同时又是对象初始化对象也调用Point拷贝构造函数,(两个对象,分别调用point两次)//
cout<<"The length of the line is:";
cout<<line.GetLen()<<endl;
cout<<"The length of the2 is:";
cout