一、代码重用
源文件:
#include <iostream>
#include"Circle.h"
using namespace std;
void Circle::Input() { cin >> r; while (r < 0) cin >> r; }
double Circle::CRadius() { return r; }
double Circle::CArea() { return (3.14 * r * r); }
double Circle::CLen() { return (3.14 * 2 * r); }
Circle::Circle() { r = 0; }
Circle::Circle(double x) { if (x < 0) r = 0; else r = x; }
Circle::Circle(Circle& x) { r = x.r; }
头文件:
class Circle
{
private:
double r;
public:
void Input();
double CRadius();
double CArea();
double CLen();
Circle();
Circle(double x);
Circle(Circle& x);
};
二、类的组合
源文件:
#include <iostream>
#include"TriCircle.h"
using namespace std;
double TriCircle::TArea() {
double totalArea;
totalArea = c0.CArea() + c1.CArea() + c2.CArea();
return totalArea;
}
double TriCircle::TLen() {
double totalLen;
totalLen = c0.CLen() + c1.CLen() + c2.CLen();
return totalLen;
}
头文件:
#include"Circle.h"
class TriCircle
{
public:
Circle c0, c1, c2;
double TArea();
double TLen();
};
1、可以理解为类的嵌套,在一个类中使用另一个类中的对象、函数。
2、多级访问语法形式:组合类对象名 . 对象成员 . 对象成员的下级成员名。(受访问权限的限制)
3、对象指针:(别名:类的聚合)
TriCircle obj;
TriCircle *p = &obj;
p->c0.Input();
p->TArea();
4、访问权限的设置:下级访问权限受上级访问权限的限制。
5、组合类的构造函数:
组合类构造函数名(形参列表) : 对象成员名1(形参1),对象成员名2(形参2),…
{
…//初始化其他非对象成员
}
(1)、有参构造函数
TriCircle :: TriCircle(double p0,double p1,double p2) : c0(p0),c1(p1),c2(p2) { }
TriCircle obj(1,2,3);
(2)、无参构造函数
TriCircle :: TriCircle() { }
(3)、拷贝构造函数
TriCircle :: TriCircle(TriCircle &rObj) : c0(rObj.c0),c1(rObj.c1),c2(rObj.c2) { }
三、类的继承与派生
源文件:
#include <iostream>
#include"BorderCircle.h"
using namespace std;
double BorderCircle::InnerArea() {
double x = CRadius();
return(3.14 * (x - w) * (x - w));
}
double BorderCircle::BorderArea() {
return(CArea()-InnerArea());
}
void BorderCircle::Input() {
Circle::Input();
cin >> w;
}
头文件:
#include"Circle.h"
class BorderCircle :public Circle {
public:
double w;
double InnerArea;
double BorderArea();
void Input();
};
1、语法:
class 派生类名:继承方式1 基类1,继承方式2 基类2,..//派生类声明部分
{
public:
新增公有成员
protected:
新增保护成员
private:
新增私有成员
);
各新增函数成员的完整定义//派生类实现部分
2、注意:
—基类的构造函数和析构函数不能被继承,派生类需重新编写自己的构造函数、析构函数。
—继承后,派生类会对其基类成员按照继承方式进行再次封装。
继承方式有3种:
(1)、public(公有继承):对基类不封装,权限不变;
(2)、protected(保护继承):对基类封装,统统被改为private,不是删除,而实际上是派生类要将其基类成员全部隐藏起来;
(3)、private(私有继承):对基类半封装,public改为protected,其余两个不变;
—使用时可以直接引用基类成员,但要是派生类中有重名的话要声明类:
BorderCircle
——访问公有的基类成员:
obj.Circle::Input();
obj.CRadius();
obj.r;
——访问公有的新增成员:
obj.Input();
obj.InnerArea();
obj.w;
3、保护权限与保护继承
(1)、类的保护权限:向其派生类定向开放的一种权限,其他情况和private一样不可被访问;
(2)、类的保护继承:注意基类public要变成protected;半封装,对下级派生类显示,对外部不能隐藏;
4、派生类的构造函数:(先基类,再新增)
——有参构造函数
BorderCircle :: BorderCircle(double p1,p2) : Circle(p1) { w=p2; }
——无参构造函数
BorderCircle :: BorderCircle() { w=0; }
——拷贝构造函数
BorderCircle :: BorderCircle(BorderCircle& rObj) : Circle(rObj) { w=rObj.w; }
5、派生类析构函数:(先新增,再基类)