版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第六章 数据抽象对象与类本章内容数据抽象与封装 类和对象对象的初始化和消亡前处理数据抽象与封装数据抽象数据的使用者只需要知道对数据所能实施的操作以及这些操作之间的关系,而不必知道数据的具体表示。数据封装指把数据及其操作作为一个整体来进行实现。数据的具体表示对使用者是不可见的,对数据的访问只能通过封装体所提供的对外接口(操作)来完成。 数据抽象与封装是面向对象程序设计的基础。例:“栈”数据的表示与操作栈是一种由若干个具有线性次序的元素所构成的复合数据。对栈只能实施两种操作:进栈(push):往栈中增加一个元素退栈(pop):从栈中删除一个元素上述两个操作必须在栈的同一端(称为栈顶,top)进行。
2、后进先出(Last In First Out,简称LIFO)是栈的一个重要性质。push(.); .pop(.); . ;push(x);pop(y);x = ytop栈:“栈”数据的表示与操作非数据抽象和封装途径定义栈数据类型const int STACK_SIZE=100;struct Stackint top;int bufferSTACK_SIZE;直接操作栈数据Stack st; /定义栈数据int x;/对st进行初始化。st.top = -1;/把12放进栈。st.top+;st.bufferst.top = 12; /把栈顶元素退栈并存入变量x。x = st.bufferst.
3、top;st.top-;存在的问题必需知道数据的表示数据表示发生变化将影响操作不安全通过过程抽象操作栈数据bool push(Stack &s, int i)if (s.top = STACK_SIZE-1) cout “Stack is overflow.n”;return false;elses.top+; s.buffers.top = i;return true;bool pop(Stack &s, int &i)if (s.top = -1) cout “Stack is empty.n”;return false; else i = s.buffers.top; s.top-;re
4、turn true;void init(Stack &s)s.top = -1;Stack st; /定义栈数据int x;init(st); /对st进行初始化。push(st,12); /把12放进栈。pop(st,x); /把栈顶元素退栈并存入变量x。存在的问题数据类型的定义与操作的定义是分开的,二者之间没有显式的联系,push、pop在形式上与下面的函数没有区别:void f(Stack &s);数据表示仍然是公开的,可以不通过push、pop来操作st,这样就可能破坏st栈的性质:在数据表示上直接操作通过函数f来操作“栈”数据的表示与操作数据抽象和封装途径定义栈数据类型const i
5、nt STACK_SIZE=100;class Stack public:Stack() top = -1; bool push(int i); bool pop(int &i);private: int top;int bufferSTACK_SIZE;bool Stack:push(int i) if (top = STACK_SIZE-1) cout “Stack is overflow.n”;return false;elsetop+; buffertop = i;return true;bool Stack:pop(int &i) if (top = -1) cout “Stack
6、is empty.n”;return false;else i = buffertop; top-;return true;使用栈类型数据Stack st; /会自动地去调用st.Stack()对st进行初始化。int x;st.push(12); /把12放进栈st。st.pop(x); /把栈顶元素退栈并存入变量x。st.top = -1; /Errorst.top+; /Errorst.bufferst.top = 12; /Errorst.f(); /Error“栈”类的另一种实现用链表实现class Stackpublic: /对外的接口Stack() top = NULL; boo
7、l push(int i);bool pop(int& i);private:struct Node int content; Node *next; *top; topa1a2anNULLbool Stack:push(int i)Node *p=new Node;if (p = NULL)cout content = i;p-next = top;top = p;return true;bool Stack:pop(int& i)if (top = NULL) cout next;i = p-content;delete p;return true;栈类型数据的实现变化了,但对使用者没有影
8、响!Stack st; int x;st.push(12);st.pop(x);类对象是数据及其操作的封装体,对象的特征则由相应的类来描述。在C+中,类是一种用户自定义类型,定义形式如下:class ;其中,类的成员包括:数据成员成员函数例:一个日期类的定义class Datepublic:void set(int y, int m, int d) /成员函数year = y;month = m;day = d;bool is_leap_year() /成员函数return (year%4 = 0 & year%100 != 0) | (year%400=0);void print() /成员
9、函数cout year . month . f(); /调用A类的成员函数f对p所指向的对象进行操作。delete p;return 0;通过对象来访问类的成员时要受到类成员访问控制的限制,例如:class Apublic:void f() . /允许访问:x,y,f,g,h private:int x;void g() . /允许访问:x,y,f,g,h protected:int y;void h() . /允许访问:x,y,f,g,h A a; ./能访问a.x、a.y、a.g和a.h吗?;void func() A a;a.f(); /OKa.x = 1; /Errora.g(); /
10、Errora.y = 1; /Errora.h(); /Error.对象的初始化当一个对象被创建时,它将获得一块存储空间,该存储空间用于存储对象的数据成员。在使用对象前,需要对对象存储空间中的数据成员进行初始化。 C+提供了一种对象初始化的机制:构造函数。构造函数是类的特殊成员函数,它的名字与类名相同、无返回值类型。创建对象时,构造函数会自动被调用。例如:class Aint x;public:A() x = 0; /构造函数.;.A a; /创建对象a:为a分配内存空间,然后调用a的构造函数A()。构造函数可以重载,其中,不带参数的(或所有参数都有默认值的)构造函数被称为默认构造函数。例如:
11、class Aint x,y;public:A() /默认构造函数 x = y = 0;A(int x1)x = x1; y = 0;A(int x1,int y1)x = x1; y = y1;.;在创建对象时,可以显式地指定调用对象类的某个构造函数。如果没有指定调用何种构造函数,则调用默认构造函数初始化。class A.public:A();A(int i);A(char *p);.A a1; /调用默认构造函数。A a2(1); /调用A(int i)。A a3(abcd); /调A(char *)。成员初始化表对于常量数据成员和引用数据成员(某些静态成员除外),不能在说明它们时初始化,
12、也不能采用赋值操作对它们初始化。例如: class A int x; const int y=1; /Error int &z=x; /Error public: A() x = 0; /OK y = 1; /Error z = &x; /Error ;对于常量数据成员和引用数据成员,可以在定义构造函数时,在函数头和函数体之间加入一个成员初始化表来对它们进行初始化。例如:class A int x; const int y; int& z; public: A(): z(x),y(1) /成员初始化表 x = 0; ;对象消亡前的处理在类中可以定义一个特殊的成员函数:析构函数,它的名字为“”,没有返回类型、不带参数、不能被重载。例如:class String int len; char *str; public: String(char* s); String(); 一个对象消亡时,系统在收回它的内存空间之前,将会自动调用析构函数。可以在析构函数中完成对象被删除前的一些清理工作(如:归还对象额外申请的资源等)。class String int len; char *str; public: String(char* s) len = strlen(s); str = new
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年农业经济与管理专业考试试卷及答案
- 井工煤矿驾驶员运行操作安全操作规程
- 2025年成人高考成考(专升本)教育理论试题及答案指导
- 2026年护士分层级考试题及答案
- 危险化学品安全培训试题及答案
- 企业销售总监年度业绩考核目标责任书
- 模板工程标准化施工方案
- 报废机动车拆解项目竣工环保验收报告
- 海上风电导管架吊装安装专项施工方案
- 供热老旧管网改造项目竣工验收报告
- 2026年小红书爆款笔记创作公式与算法机制
- 六西格玛设计DFSS
- 商铺租赁终止合同范本范文精简处理
- 新人教版九年级全册物理《比热容》教学课件
- 15D501 建筑物防雷设施安装
- YY/T 0513.2-2020同种异体修复材料第2部分:深低温冷冻骨和冷冻干燥骨
- 库房管理培训课件
- 保温保冷施工方案
- 消防工程竣工验收全套资料(范本)
- 机械精度及检测课件
- 新课程背景下英语教学听课评课-课件
评论
0/150
提交评论