子对象
子对象的描述会关于两个类,为了说清楚子对象的关系,换一个话题。
平面上的点与圆
为了说清楚两个类之间的关系,现在编写两个类
- 平面直角坐标系中的点类 - CMyPoint
- 平面直角坐标系中的圆类 - CMyCircle
当然,这里的核心是点与圆的关系:圆类是包含于点类。
代码部分
先把代码打出来(代码不全,主要是理解)
对于代码一步一步补全:
class CMyPoint
{
protected:
double x,y;
public :
CMyPoint(double a,double b)
{
x=a;
y=b;
}
void showPoint()
{
......
}
void movePoint(double a,double b)
{
......
}
};
class CMyCircle
{
protected:
CMyPoint center; //这里就是子对象
double radius;
public :
CMyCircle(double a,double b,double c)
{
......
}
void showPoint()
{
......
}
void movePoint(double a,double b)
{
......
}
};
其中子对象的概念:
关注上面这一行代码:可以发现在CMyCircle中创建了CMyPoint对象作为它的数据成员,成为CMyCircle类的对象包含一个CMyPoint类的对象作为其子对象。
构造函数
那么现在就有一个问题:CMyCircle的构造函数怎么写?
不妨来试试:
CMyCircle(double a,double b,double c)
{
center.x=a;
center.y=b;
radius=c;
}
但是上机运行后,会发现对前面两个赋值报错
那么我们再试试一个新的:
CMyCircle(double a,double b,double c)center.x(a).center.y(b),radius(c)
{
}
这样是构造函数对各个数据成员初始化的标准写法,但是系统还是报错。
这里由于两个类没有继承关系,所以只能访问public成员,但是x和y是protected下,是不允许访问的。
那么正确写法是什么呢?
直接用center去调用构造函数的实际参数。
CMyCircle(double a,double b,double c)center(a,b)
{
radius=c;
}
当然这样也行
CMyCircle(double a,double b,double c)center(a,b),radius(c)
{
}
movePoint函数如何设计呢?
先来看看这个判断对不对?
void movePoint(double a,double b)
{
center.x +=a;
center.y +=b;
}
很明显,有了上面的经验,这个肯定是不对的,center.x 与 center.y都是不可直接访问的
所以我们需要这样做:
利用CMyPoint类中的move函数来完成圆的移动
void movePoint(double a,double b)
{
center.movePoint(a,b);
}
指向对象的指针(c中体现java)
另外外加一个知识点:如何用指针来完成以上的代码呢?
class CMyCircle
{
protected:
CMyPoint *pcenter; //这里就是子对象的指针
double radius;
public :
CMyCircle(double a,double b,double c)
{
pcenter = new CMyPoint(a,b);
delete pcenter;
}
};
其实指针做法,直接就对应到java语言中来了
class MyPoint
{
protected double x,y;
public MyPoint(double a,double b)
{
x=a;
y=b;
}
}
class MyCircle
{
protected MyPoint center;
protected double radius;
public MyCircle(double a,double b,double c)
{
center = new MyPoint(a,b);
radius = c;
}
}
构造函数调用次序
四个字概括:由内及外
析构很好理解:反次序