C++高手来呀~~~~~~~

来源:百度知道 编辑:UC知道 时间:2024/07/15 22:55:50
#include"iostream.h"
class CPoint
{
protected:
int x,y;
public:
CPoint(int xx=0,int yy=0);
CPoint(CPoint &p);
void display();
int getX();
int getY();
};
CPoint::CPoint(int xx,int yy)
{
x=xx;
y=yy;
cout<<"构造函数 CPoint(int,int)被调用,";
cout<<"("<<x<<","<<y<<")"<<endl;
}
CPoint::CPoint(CPoint &p)
{
x=p.x;
y=p.y;
cout<<"拷贝构造函数 CPoint(CPoint &)被调用,";
cout<<"("<<x<<","<<y<<")"<<endl;
}
void CPoint::display()
{
cout<<"("<<x<<","<<y<<")";
}
int CPoint::getX()
{
return x;
}
int CPoint::getY()
{
return y;
}
class CCircle:public CPoint
{

创建派生类对象之前会先创建基类的对象。
也就是说在调用派生类的构造函数之前会先调用基类的构造函数。
析构的时候相反:先调用派生类的析构函数,再调用派生类的。

详细的解释:
第一行创建的是第一个点 p(50,60)

第二、三行创建第一个圆 c1,因为只有一个参数,因此这个参数传给CCircle的数据成员 r,调用 CPoint 的带参构造函数。

第三、四、五行创建第二个圆 c2。由于构造函数 CCircle(CPoint c, double rr) 中第一个参数是值传递,因些调用拷贝构造函数先创建一个 CPoint 类的对象,所以有打印出来的(50,60)——第4行,因为是用 p 来创建的。
由于是值传递,因此在函数返回的时候又会创建一个 CPoint 类的临时对象,这个时候调用的是带默认参数的构造函数。
所以出现了第二个(0,0)。

后面的就不用多说了。

因为你的CPoint的构造函数
CPoint(int xx=0,int yy=0);
设置了初始值。

如果:
CPoint c1;
则,这时成员变量 x = 0; y = 0;

如果
CPoint c1(1);
这时 x = 1; y = 0;

CPoint C1(x,2);
则 x=1; y = 2;

由于你定义了CPoint类的一个构造函数,且没有定义默认构造函数,编译器不会为该类创建默认构造函数。