数据抽象
数据抽象是指,只向外界提供关键信息,并隐藏其后台的实现细节,即只表现必要的信息而不呈现细节。
数据抽象有两个重要的优势:
- 类的内部受到保护,不会因无意的用户级错误导致对象状态受损。
- 类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对那些要求不改变用户级代码的错误报告。
如果只在类的私有部分定义数据成员,编写该类的作者就可以随意更改数据。如果实现发生改变,则只需要检查类的代码,看看这个改变会导致哪些影响。如果数据是公有的,则任何直接访问旧表示形式的数据成员的函数都可能受到影响。
测试代码如下:
#include<iostream>
using namespace std;
class Adder
{
public:
// 构造函数
Adder(int i = 0)
{
total=i;
}
// 对外的接口
void addNum(int number)
{
total+=number;
}
// 对外的接口
int getTotal()
{
return total;
}
private:
// 对外隐藏的数据
int total;
};
int main()
{
Adder a;
a.addNum(10);
a.addNum(20);
a.addNum(30);
cout<<"Total "<< a.getTotal()<<endl;
return 0;
}
输出结果:
tekken@tekken:~/C++WS$ ./a.out
Total 60
接口(抽象类)
接口描述了类的行为和功能,而不需要完成类的特定实现。
C++ 接口是使用抽象类来实现的,抽象类与数据抽象互不混淆,数据抽象是一个把实现细节与相关的数据分离开的概念。
如果类中至少有一个函数被声明为纯虚函数,则这个类就是抽象类。纯虚函数是通过在声明中使用 "= 0" 来指定的,如下所示:
class Box
{
public:
// 纯虚函数
virtual double getVolume() = 0;
private:
double length; // 长度
double breadth; // 宽度
double height; // 高度
};
设计抽象类(通常称为 ABC)的目的,是为了给其他类提供一个可以继承的适当的基类。抽象类不能被用于实例化对象,它只能作为接口使用。如果试图实例化一个抽象类的对象,会导致编译错误。
因此,如果一个 ABC 的子类需要被实例化,则必须实现每个虚函数,这也意味着 C++ 支持使用 ABC 声明接口。如果没有在派生类中重写纯虚函数,就尝试实例化该类的对象,会导致编译错误。
可用于实例化对象的类被称为具体类。
测试代码如下:
#include<iostream>
using namespace std;
// 基类
class Shape
{
public:
// 提供接口框架的纯虚函数
virtual int getArea()=0;
void setWidth(int w)
{
width=w;
}
void setHeight(int h)
{
height=h;
}
protected:
int width;
int height;
};
// 派生类
class Rectangle:public Shape
{
public:
int getArea()
{
return(width*height);
}
};
class Triangle:public Shape
{
public:
int getArea()
{
return(width*height)/2;
}
};
int main(void)
{
Rectangle Rect;
Triangle Tri;
Rect.setWidth(5);
Rect.setHeight(7);
// 输出对象的面积
cout<<"Total Rectangle area: "<<Rect.getArea()<<endl;
Tri.setWidth(5);
Tri.setHeight(7);
// 输出对象的面积
cout<<"Total Triangle area: "<<Tri.getArea()<<endl;
return 0;
}
输出结果:
tekken@tekken:~/C++WS$ ./a.out
Total Rectangle area: 35
Total Triangle area: 17
网友评论