首页 > 编程知识 正文

c语言如何保存数据(c数据类型有哪几种)

时间:2023-05-03 19:28:43 阅读:78530 作者:2796

为了理解问题,需要分离不必要的细节。 你建立对自己问题的抽象视图,抽象模型。 这个建模过程称为抽象abstraction。

模型定义抽象视图,仅关注与问题和求解器相关的部分。 必须定义以下属性: 影响的数据; 已识别的操作; ADT是模型。

1 .提供类型。

2 .提供操作集合。 这个集合叫做接口。

3 .接口操作是类型数据结构的唯一访问途径。

4 .原理和前提定义了类型的应用领域。

数据抽象是指数据结构和数据表示的设计者只向外部提供重要信息,而隐藏其后台实现的详细信息。 也就是说,只表达必要的信息,不表达详细内容。 我只关注公开的重要接口信息。

数据抽象是一种依赖于接口实现分离的编程(设计)技术。

让我们看看现实的例子,比如电视。 用户可以切换频道、调整音量、添加扬声器、录像机和DVD播放器等外部组件,但不知道内部实现的详细信息。 也就是说,不知道如何通过电缆接收信号,如何转换信号,并最终显示在画面上。 这些是电视设计师的工作。

因此,电视将其内部实现与外部接口分离,作为用户的你不需要知道其内部实现原理,可以直接通过其外部接口(例如电源按钮、遥控器、声音量控制器)操作电视。

例如,程序可以调用sort ()函数,而不知道用于对函数中的数据进行排序的算法。 事实上,函数排序的基本实现取决于库的版本。 在快速排序、气泡、选择、插入或其他排序算法中,函数调用照常工作,除非接口发生了更改。

就c编程而言,其结构化编程的方法也是模块分解的方法,用函数实现模块化,用函数三种控制结构实现某种分解的功能,是粗糙的数据和数据操作的封装技术,在头文件中接口但是,函数和操作的数据封装不够,没有适当的控制方法来访问数据,而且数据和操作这些数据的函数不能实现适当的凝聚和结合。 也就是说,类型这一概念没有被抽象出来。

在c编程中,c类类型允许数据抽象。 它们向外部提供了许多用于处理对象数据的常用方法。 也就是说,类的内部实现(包含的私有数据和成员函数的具体实现)在外部实际上是未知的。

封装---信息隐藏技术——对象的用户无法查看对象的数据和操作细节。

数据抽象----从对象中发现类的过程

抽象数据类型----类

c使用类定义自己的抽象数据类型(ADT )。

数据封装是指将数据和处理数据的函数组合在一起的机制,数据抽象是指只需向用户公开界面,就能隐藏具体实现细节的机制。

通过创建c类,支持封装和数据隐藏,包括公共、保护和私有访问控制。

封装是一种信息隐藏技术,旨在将对象用户与设计者分开,将类的定义与实现分开。

在c程序中,具有公共和私有成员的所有类都可以用作数据封装和数据抽象的实例。

在类类型中,其数据成员和成员函数聚合为一种类型,成员函数操作数据成员,其范围仅限于类类型,类类型可以通过继承和组合实现一定的组合。

可以使用iostream类的cout对象将数据输出到标准输出,如下所示:

#include iostream

用户命名空间STD;

int main () )

{

cout 'Hello C ' endl;

返回0;

}

在此,您不需要了解cout如何在用户屏幕上显示文本。 只要知道公共接口就可以了,cout的基础实现可以自由更改。

在c中,使用访问标签定义类的抽象接口。 类可以包含0个以上的访问标签。

在“公共”选项卡上定义的成员可以访问程序的所有部分。 一种类型的数据抽象视图由其公共成员定义,并表示为数据抽象的接口部分。

在“专用”(private )标签中定义的成员无法访问使用类的代码。 专用部分为使用类型的代码隐藏了实现详细信息。

访问标签的显示频率没有限制。 每个访问标签指定后续成员定义的访问级别。 的访问级别一直有效,直到显示以下访问标签或显示类主体的方括号:

数据抽象有两个重要的优点。

第1类内部受到保护,目标状态不会因意外的用户级错误而受损。

2 类实现可能随着时间的推移而发生变化,以便应对不断变化的需求,或者应对那些要求不改变用户级代码的错误报告。

如果只在类的私有部分定义数据成员,编写该类的设计者就可以随意更改数据。如果实现发生改变,则只需要检查类的代码,看看这个改变会导致哪些影响。如果数据是公有的,则任何直接访问旧表示形式的数据成员的函数都可能受到影响。

C++ 程序中,任何带有公有和私有成员的类都可以作为数据抽象的实例。请看下面的实例:

#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; }

当上面的代码被编译和执行时,它会产生下列结果:

Total 60

上面的类把数字相加,并返回总和。公有成员 addNum 和 getTotal 是对外的接口,用户需要知道它们以便使用类。私有成员 total 是用户不需要了解的,但又是类能正常工作所必需的。

抽象把代码分离为接口和实现。所以在设计组件时,必须保持接口独立于实现,这样,如果改变底层实现,接口也将保持不变。

在这种情况下,不管任何程序使用接口,接口都不会受到影响,只需要将最新的实现重新编译即可。

如果一个类只是做为接口存在,而实现由其派生类去实现的话,这样的类称为抽象类,类中至少有一个函数被声明为纯虚函数,纯虚函数是通过在声明中使用 "= 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; }

当上面的代码被编译和执行时,它会产生下列结果:

Total Rectangle area: 35 Total Triangle area: 17

从上面的实例中,我们可以看到一个抽象类是如何定义一个接口 getArea(),两个派生类是如何通过不同的计算面积的算法来实现这个相同的函数。

面向对象的系统可能会使用一个抽象基类为所有的派生类和对象提供一个适当的、通用的、标准化的接口。然后,派生类通过继承抽象基类,就把所有类似的操作都继承下来。

外部接口提供的功能(即公有函数)在抽象基类中是以纯虚函数的形式存在的。这些纯虚函数在相应的派生类中被实现。

这个架构也使得新的应用程序可以很容易地被添加到系统中,即使是在系统被定义之后依然可以如此。

-End-

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。