c++程序设计 陈圣国 第3章

上传人:E**** 文档编号:89400224 上传时间:2019-05-24 格式:PPT 页数:133 大小:199.01KB
返回 下载 相关 举报
c++程序设计 陈圣国 第3章_第1页
第1页 / 共133页
c++程序设计 陈圣国 第3章_第2页
第2页 / 共133页
c++程序设计 陈圣国 第3章_第3页
第3页 / 共133页
c++程序设计 陈圣国 第3章_第4页
第4页 / 共133页
c++程序设计 陈圣国 第3章_第5页
第5页 / 共133页
点击查看更多>>
资源描述

《c++程序设计 陈圣国 第3章》由会员分享,可在线阅读,更多相关《c++程序设计 陈圣国 第3章(133页珍藏版)》请在金锄头文库上搜索。

1、3.1 最简单的类定义 3.2 构造函数与析构函数 3.3 类的派生 3.4 友元 3.5 静态成员,3.3 类的派生,返回主目录,3.1 最简单的类定义,3.1.1 类定义 类和对象是C+语言中面向对象程序设计的最基本的概念。C语言与其它传统的过程化语言没有类与对象的概念,这些语言所写的程序通常采用函数或过程来描述对数据结构类型的操作,但又将函数及其操作的数据相分离,所写的程序完全依赖于数据的结构和形式。C+语言通过类将数据结构和与之相关的操作封装在一起,形成一个整体,具有良好的外部接口,可以防止对数据结构内部未经授权的访问,提供了程序模块之间的独立性。本节首先介绍类定义的方式。,下面是一个

2、简单的类定义的例子。它定义了一个类Point,用来表示屏幕上的一个点,x、y坐标的有效范围分别为0639 、0479: class Point int xVal,yVal; /x、y坐标 public: void SetPt(int, int); /设置x、y坐标 void OffsetPt(int, int); /点坐标移位运算 int GetX( ); /读取x坐标 int GetY( ); /读取y坐标 ;,C+中,类通过class来构造,class声明的语法与C语言中的struct声明类似。上面的例子声明了一个叫作Point的类,它包含两个数据成员(xVal、yVal)以及四个函数成员

3、。声明了以上的类后,可以定义Point对象,即Point类的一个实例,例如: Point p; 此处p为一个Point类的对象。在程序中,可以通过C语言中结构变量的成员运算符“.”来操作p的公有部分的四个函数成员: p.SetPt(10, 10); 此处调用Point的函数成员。在C+中,不允许对象的外部直接访问对象的私有部分。,上面例子中Point类的两个数据成员未声明属性,缺省认为是私有的(private);另外四个函数成员在public部分声明,则是公有的,可以由对象的外部直接访问。上面的类声明也可以像下面这样声明: class Point private: /此处显式声明xVal, y

4、Val 为私有int xVal, yVal; public: void SetPt(int, int); void OffsetPt(int, int);,int GetX( ); int GetY( ); ; 在C+中,类的数据成员和函数成员都可以声明为私有的或公有的,应该根据实际的需要来进行定义。公有部分指定了类的接口,私有部分只能由该类的函数成员访问。,3.1.2 函数成员的实现 函数成员的实现通常不是类的一部分,通常在别处出现。以下是3.1.1例子中类的四个函数成员的实现: void Point:SetPt(int x, int y) if(x=0 ,void Point:Offset

5、Pt(int x, int y) xVal+=x; if(xVal=640) xVal=639; if(xVal=480) yVal=479; if(yVal0) yVal=0; ,int Point:GetX( ) return xVal; int Point:GetY( ) return yVal; ,在这些函数成员的实现中,每个函数成员的名字前都加上了Point:来指示它属于Point类。这里类的成员函数直接访问类的私有部分数据xVal和yVal,类的外部不能直接访问私有成员xVal和yVal,可以通过GetX和GetY两个函数成员获得xVal和yVal的值,它们的值只能由SetPt和O

6、ffsetPt改变,可以确保数据在有效范围之内。 也可以用内置函数的方式来实现C+中类的函数成员,例如: inline int Point:GetX( ) return xVal; ,类的函数成员定义为内置函数更为简单的方法是:在定义时把它的实现包含在类定义中,此时不需使用关键字inline:,class Point int xVal,yVal; public: void SetPt(int, int); void OffsetPt(int, int); int GetX( )return xVal; /内置函数 int GetY( )return yVal; ;,3.1.3 函数成员的隐含参

7、数 C+语言编译器为每一个对象的数据成员分配存储空间,但是它并不为函数成员分配存储空间。同一个类的所有对象的函数成员的可执行代码在内存空间中只有一份,程序在执行时根据调用该函数成员的对象来决定函数中使用的类成员在存储空间的位置。 对上面的类Point,如果使用C语言来实现,我们可以定义一个结构类型,然后定义若干对它进行操作的函数,将要操作的结构变量的指针传递给该函数,例如:,struct point int xVal,yVal; ; void SetPt(struct point *, int, int); 实质上,C+程序在执行时,类的函数成员有一个隐含参数,函数成员在被执行时通过该隐含参数

8、得到指向调用该函数的对象的指针,通常在编写程序时不需要显式使用该指针,但有时可以使用它来实现一些特殊的功能,C+提供了一个关键字this来表示该指针。例如,上面的类Point的函数成员GetX可以写成下面的形式:,int Point:GetX( ) return this-xVal; 当然,这个程序并不需要this。在后面的章节中,读者将会看到必须显式使用this关键字的例子。,3.1.4 C+中的结构 在C+中,结构也可以有函数成员,可以使用struct来声明一个类。与class声明一个类不同的是,它的成员缺省为公有的。如上面例子中声明的类Point,如果将关键字class作为struct,

9、即 struct Point int xVal,yVal; public: void SetPt(int,int); void OffsetPt(int,int);,与class声明的类相同,也可以显式地使用private将其成员声明为私有的,int GetX( ); int GetY( ); ; 等同于 class Point public: int xVal, yVal; void SetPt(int, int); void OffsetPt(int, int); int GetX( ); int GetY( ); ;,3.1.5 编程示例: 集合的实现 本节读者将会看到一个完整的例子,实

10、现一个用于存储整型数据元素的集合。 集合是对象的一个无序组合。利用构造类,将集合定义为一个新的数据类型。在下面的程序中,类Set的定义使用了一个整数数组来存储集合中的数据元素,并实现了常见的集合操作。 程序3.1 集合的实现,#include const maxCard=16; /集合中元素个数的最大值 enum ErrCode noErr, overflow; /错误代码 enum Bool False, True; /Bool类型定义 class Set int elemsmaxCard; /存储元素的数组 int card; /集合中元素的个数,public: void EmptySet

11、( )card=0; Bool Member(int); ErrCode AddElem(int); void RmvElem(int); void Copy(Set *); Bool Equal(Set *); void Print( ); void Intersect(Set *, Set *); ErrCode Union(Set *, Set *); ;,Bool Set:Member(int elem) for(int i=0;icard;+i) if(elemsi=elem) return True; return False; ErrCode Set:AddElem(int el

12、em) if(Member(elem) return noErr; if(cardmaxCard) elemscard+=elem; return noErr;, return overflow; void Set:RmvElem(int elem) for(int i=0;icard;+i) if(elemsi=elem) for(;icard-1;+i) elemsi=elemsi+1; -card;,return; void Set:Copy(Set *set) for(int i=0;ielemsi=elemsi; set-card=card; Bool Set:Equal(Set *

13、set) if(card!=set-card) return False;,for(int i=0;iMember(elemsi) return False; return True; void Set:Print( ) cout“; for(int i=0;icard-1;+i) coutelemsi “;“;,if(card0) coutcard=0; for(int i=0;icard;+j) if(elemsi=set-elemsj) res-elemsres-card+=elemsi; break; ,ErrCode Set:Union(Set *set,Set *res) set-

14、Copy(res); for(int i=0;iAddElem(elemsi)=overflow) return overflow; return noErr; /下面是测试用的主程序,void main( ) Set s1, s2, s3; s1.EmptySet( ); s2.EmptySet( ); s3.EmptySet( ); s1.AddElem(10); s1.AddElem(20); s1.AddElem(30); s1.AddElem(40); s2.AddElem(30); s2.AddElem(50); s2.AddElem(10);,s2.AddElem(60); co

15、ut“s1=“; s1.Print( ); cout“s2=“; s2.Print( ); s2.RmvElem(50); cout“s2-50=“; s2.Print( ); if(s1.Member(20) cout“20 is in s1n“; s1.Intersect(,cout运算符。有关对象指针和对象的动态创建内容将在第5章介绍。,(3) 函数成员Copy完成集合的复制。这个函数中直接访问了参数set所指向对象的私有数据成员。前面已经讲过,C+中不允许类的外部函数直接访问对象的私有部分,实际上,在C+中,类的函数成员可以直接访问同类对象的私有部分。 (4) 程序中使用了coutexpr形式的语句来完成输出。这里的运算符为C+中的流输出符。流是C+中对输入输出数据一种更抽象的描述,详细的内容在第7章介绍。这里的cout为标准的输出流,语句cout“相当于C语言中的printf(“)。在程序中要使用流操作必须包含头文件iostream.h(不同编译器提供的头文件的名字有可能不同,请查询你所使用的编译器的文档)。,3.2 构造函数与析构函数,3.2.1 构造函数 C语言中,可以在定义一个结构变量时初始化该变量各成员。上一

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号