最近在看C++,今天遇到了C++中的组合问题,顺便被拷贝函数的调用时间给困扰了,于是花时间专门研究了一下。首先给出拷贝构造函数被调用的情况:1.当用类的一个对象去初始化该类的另一个对象时。2.如果函数的形参是类的对象,调用函数时,进行形参和实参结合时。3.如果函数的返回值是类的对象,函数执行返回调用者时。下面贴出代码进行分析:
#include <iostream>
#include <cmath>
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<<"Point拷贝构造函数被调用"<<endl;
}
class Line{
public:
Line(Point xp1,Point xp2);
Line(Line &L);
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<<"The length of the line is"<<endl;
cout<<line.GetLen()<<endl;
cout<<"The length of the line2 is"<<endl;
cout<<line2.GetLen()<<endl;
system("pause");
}
类的组合就是在一个类中包含了另外的一个类,以上程序的执行结果为