计算机程序设计基础-c简介.ppt

上传人:小飞机 文档编号:6606575 上传时间:2023-11-17 格式:PPT 页数:71 大小:248.50KB
返回 下载 相关 举报
计算机程序设计基础-c简介.ppt_第1页
第1页 / 共71页
计算机程序设计基础-c简介.ppt_第2页
第2页 / 共71页
计算机程序设计基础-c简介.ppt_第3页
第3页 / 共71页
计算机程序设计基础-c简介.ppt_第4页
第4页 / 共71页
计算机程序设计基础-c简介.ppt_第5页
第5页 / 共71页
点击查看更多>>
资源描述

《计算机程序设计基础-c简介.ppt》由会员分享,可在线阅读,更多相关《计算机程序设计基础-c简介.ppt(71页珍藏版)》请在三一办公上搜索。

1、1,C+语言简介,清华大学 郑 莉,2,本讲内容,类与对象继承与派生多态性C+标准模板库,3,回顾:面向过程的设计方法,重点:重点是实现的细节和过程,将数据与函数分开。形式:主模块+若干个子模块(main()+子函数)。特点:自顶向下,逐步求精功能分解。缺点:效率低,程序的可重用性差。,面向对象的思想,4,面向对象的方法,目的:实现软件设计的产业化。观点:自然界是由实体(对象)所组成。程序设计方法:使用面向对象的观点来描述、模仿并处理现实问题。要求:高度概括、分类、和抽象。,面向对象的思想,5,抽象,抽象是对具体对象(问题)进行概括,抽出这一类对象的公共性质并加以描述的过程。先注意问题的本质及

2、描述,其次是实现过程或细节。数据抽象:描述某类对象的属性或状态(对象相互区别的物理量)。代码抽象:描述某类对象的共有的行为特征或具有的功能。抽象的实现:通过类的声明。,OOP的基本特点,6,抽象实例钟表,数据抽象:int Hour,int Minute,int Second代码抽象:SetTime(),ShowTime(),OOP的基本特点,7,抽象实例钟表类,class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;,OOP的基本特点,8

3、,抽象实例人,数据抽象:char*name,char*gender,int age,int id代码抽象:生物属性角度:GetCloth(),Eat(),Step(),社会属性角度:Work(),Promote(),OOP的基本特点,9,封装,将抽象出的数据成员、代码成员相结合,将它们视为一个整体。目的是曾强安全性和简化编程,使用者不必了解具体的实现细节,而只需要通过外部接口,以特定的访问权限,来使用类的成员。实现封装:类声明中的,OOP的基本特点,10,封装,实例:class Clock public:void SetTime(int NewH,int NewM,int NewS);void

4、 ShowTime();private:int Hour,Minute,Second;,特定的访问权限,OOP的基本特点,11,继承与派生,是C+中支持层次分类的一种机制,允许程序员在保持原有类特性的基础上,进行更具体的说明。实现:声明派生类,OOP的基本特点,12,多态性,多态:同一名称,不同的功能实现方式。目的:达到行为标识统一,减少程序中标识符的个数。实现:重载函数和虚函数,OOP的基本特点,13,c+中的类,类是具有相同属性和行为的一组对象的集合,它为属于该类的全部对象提供了统一的抽象描述,其内部包括属性和行为两个主要部分。利用类可以实现数据的封装、隐藏、继承与派生。利用类易于编写大型

5、复杂程序,其模块化程度比C中采用函数更高。,类 和 对 象,14,类的声明形式,类是一种用户自定义类型,其声明形式:class 类名称 public:公有成员(外部接口)private:私有成员 protected:保护型成员,类 和 对 象,15,公有类型成员,是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。以关键字public修饰。,类 和 对 象,16,私有类型成员,只允许本类中的函数访问,而类外部的任何函数都不能访问。以关键字private修饰。如果紧跟在类名称的后面声明私有成员,则关键字private可以省略。,类 和 对 象,17,保护类型,与private类似,其差别

6、表现在继承与派生时对派生类的影响不同。以关键字protected修饰。,类 和 对 象,18,类的成员,class Clock public:void SetTime(int NewH,int NewM,int NewS);void ShowTime();private:int Hour,Minute,Second;,类 和 对 象,数据成员,函数成员,void Clock:SetTime(int NewH,int NewM,int NewS)Hour=NewH;Minute=NewM;Second=NewS;void Clock:ShowTime()coutHour:Minute:Secon

7、d;,19,20,数据成员,与一般的变量声明相同,但需要将它放在类的声明体中。,类 和 对 象,21,函数成员,在类中说明原型,可以在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。允许声明重载函数和带默认形参值的函数。,类 和 对 象,22,对象,类的对象是该类的某一特定实体,即类类型的变量。声明形式:类名 对象名;例:Clock myClock;,类 和 对 象,23,类中成员的访问方式,类中成员互访直接使用成员名从类外访问使用“对象名.成员名”方式访问 public 属性的成员,类 和 对 象,24,类的应用举例,#includeusing

8、 namespace std;class Clock./类的声明略/.类的实现略int main()Clock myClock;myClock.SetTime(8,30,30);myClock.ShowTime();,类 和 对 象,25,组合的概念,可以在已有的抽象的基础上实现更复杂的抽象。类中的数据成员是另一个类的对象。,类 的 组 合,26,举例,class Point private:float x,y;/点的坐标 public:Point(float h,float v);/构造函数 float GetX(void);/取X坐标 float GetY(void);/取Y坐标 void

9、 Draw(void);/在(x,y)处画点;/.函数的实现略,类 的 组 合,class Line private:Point p1,p2;/线段的两个端点 public:Line(Point a,Point b);/构造函数 Void Draw(void);/画出线段;/.函数的实现略,49,28,继承与派生简介,29,类的继承与派生,保持已有类的特性而构造新类的过程称为继承。在已有类的基础上新增自己的特性而产生新类的过程称为派生。被继承的已有类称为基类(或父类)。派生出的新类称为派生类。,30,继承与派生问题举例,类的继承与派生,31,继承与派生问题举例,类的继承与派生,32,继承与派生

10、问题举例,类的继承与派生,33,继承与派生问题举例,类的继承与派生,34,继承与派生的目的,继承的目的:实现代码重用。派生的目的:当新的问题出现,原有程序无法解决(或不能完全解决)时,需要对原有程序进行改造。,类的继承与派生,35,派生类的声明,class 派生类名:继承方式 基类名 成员声明;,类的继承与派生,36,继承举例,class Point/基类Point类的声明public:/公有函数成员void InitP(float xx=0,float yy=0)X=xx;Y=yy;void Move(float xOff,float yOff)X+=xOff;Y+=yOff;float G

11、etX()return X;float GetY()return Y;private:/私有数据成员float X,Y;,类成员的访问控制,class Rectangle:public Point/派生类声明public:/新增公有函数成员void InitR(float x,float y,float w,float h)InitP(x,y);W=w;H=h;/调用基类公有成员函数float GetH()return H;float GetW()return W;private:/新增私有数据成员float W,H;,37,#include#includeusing namecpace st

12、d;int main()Rectangle rect;rect.InitR(2,3,20,10);/通过派生类对象访问基类公有成员rect.Move(3,2);coutrect.GetX(),rect.GetY(),rect.GetH(),rect.GetW()endl;return 0;,38,39,多态性简介,40,多态性的概念,多态性是面向对象程序设计的重要特征之一。多态性是指发出同样的消息被不同类型的对象接收时有可能导致完全不同的行为。多态的实现:函数重载运算符重载虚函数,41,问题举例复数的运算,class complex/复数类声明public:complex(double r=0

13、.0,double i=0.0)/构造函数 real=r;imag=i;void display();/显示复数的值private:double real;double imag;,运算符重载,42,问题举例复数的运算,用“+”、“-”能够实现复数的加减运算吗?实现复数加减运算的方法 重载“+”、“-”运算符,运算符重载,43,运算符重载的实质,运算符重载是对已有的运算符赋予多重含义必要性C+中预定义的运算符其运算对象只能是基本数据类型,而不适用于用户自定义类型(如类)实现机制将指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的实参。编译系统对重载运算符的选择,遵循函数重载的

14、选择原则。,运算符重载,44,运算符重载,例,将“+”、“-”运算重载为复数类的成员函数。规则:实部和虚部分别相加减。操作数:两个操作数都是复数类的对象。,#includeusing namespace std;class complex/复数类声明public:/外部接口complex(double r=0.0,double i=0.0)real=r;imag=i;/构造函数complex operator+(complex c2);/+重载为成员函数complex operator-(complex c2);/-重载为成员函数void display();/输出复数private:/私有数

15、据成员double real;/复数实部double imag;/复数虚部;,45,complex complex:operator+(complex c2)/重载函数实现complex c;c.real=c2.real+real;c.imag=c2.imag+imag;return complex(c.real,c.imag);,46,complex complex:operator-(complex c2)/重载函数实现complex c;c.real=real-c2.real;c.imag=imag-c2.imag;return complex(c.real,c.imag);,47,vo

16、id complex:display()cout(real,imag)endl;int main()/主函数complex c1(5,4),c2(2,10),c3;/声明复数类的对象coutc1=;c1.display();coutc2=;c2.display();c3=c1-c2;/使用重载运算符完成复数减法coutc3=c1-c2=;c3.display();c3=c1+c2;/使用重载运算符完成复数加法coutc3=c1+c2=;c3.display();,48,程序输出的结果为:c1=(5,4)c2=(2,10)c3=c1-c2=(3,-6)c3=c1+c2=(7,14),49,50,

17、虚函数,虚函数是动态绑定的基础。是非静态的成员函数。在类的声明中,在函数原型之前写virtual。virtual 只用来说明类声明中的原型,不能用在函数实现时。具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。本质:不是重载声明而是覆盖。调用方式:通过基类指针或引用,执行时会根据指针指向的对象的类,决定调用哪个函数。,虚 函 数,51,例,#include using namespace std;class B0/基类B0声明public:/外部接口virtual void display()/虚成员函数 coutB0:display()endl;class B1

18、:public B0/公有派生 public:void display()coutB1:display()endl;class D1:public B1/公有派生 public:void display()coutD1:display()endl;,虚 函 数,void fun(B0*ptr)/普通函数 ptr-display();int main()/主函数B0 b0,*p;/声明基类对象和指针B1 b1;/声明派生类对象D1 d1;/声明派生类对象p=/调用派生类D1函数成员,运行结果:B0:display()B1:display()D1:display(),52,53,函数模板,函数模板

19、可以用来创建一个通用功能的函数,以支持多种不同形参,进一步简化重载函数的函数体设计。声明方法:template 函数声明,函 数 模 板,54,求绝对值函数的模板,#includeusing namespace std;templateT abs(T x)return x0?-x:x;int main()int n=-5;double d=-5.5;coutabs(n)endl;coutabs(d)endl;,函 数 模 板,运行结果:55.5,55,求绝对值函数的模板分析,编译器从调用abs()时实参的类型,推导出函数模板的类型参数。例如,对于调用表达式abs(n),由于实参n为int型,所

20、以推导出模板中类型参数T为int。当类型参数的含义确定后,编译器将以函数模板为样板,生成一个函数:int abs(int x)return x0?-x:x;,函 数 模 板,56,类模板的作用,使用类模板使用户可以为类声明一种模式,使得类中的某些数据成员、某些成员函数的参数、某些成员函数的返回值,能取任意类型(包括基本类型的和用户自定义类型)。,类 模 板,57,类模板的声明,类模板:template class 类名类成员声明如果需要在类模板以外定义其成员函数,则要采用以下的形式:template 类型名 类名:函数名(参数表),类 模 板,58,C+标准模板库简介,59,泛型程序设计,将程

21、序写得尽可能通用 将算法从特定的数据结构中抽象出来,成为通用的C+的模板为泛型程序设计奠定了关键的基础 STL是泛型程序设计的一个范例 容器(container)迭代器(iterator)算法(algorithms)函数对象(function object),60,容器,容器类是容纳、包含一组元素或元素集合的对象。异类容器类与同类容器类顺序容器与关联容器七种基本容器:向量(vector)、双端队列(deque)、列表(list)、集合(set)、多重集合(multiset)、映射(map)和多重映射(multimap),概念和术语,61,容器的接口,通用容器运算符=,!=,=,=,=方法(函数

22、)迭代方法begin(),end(),rbegin(),rend()访问方法size(),max_size(),swap(),empty(),62,迭代器,迭代器是面向对象版本的指针指针可以指向内存中的一个地址迭代器可以指向容器中的一个位置STL的每一个容器类模版中,都定义了一组对应的迭代器类。使用迭代器,算法函数可以访问容器中指定位置的元素,而无需关心元素的具体类型。,概念和术语,63,算法,C+标准模板库中包括70多个算法其中包括查找算法,排序算法,消除算法,记数算法,比较算法,变换算法,置换算法和容器管理等等。这些算法的一个最重要的特性就是它们的统一性,并且可以广泛用于不同的对象和内置的

23、数据类型。,概念和术语,64,顺序容器,顺序容器的接口插入方法push_front(),push_back(),insert(),运算符“=”删除方法pop(),erase(),clear()迭代访问方法使用迭代器其它顺序容器访问方法(不修改访问方法)front(),back(),下标运算符,容 器,65,顺序容器向量,向量属于顺序容器,用于容纳不定长线性序列(即线性群体),提供对序列的快速随机访问(也称直接访问)向量是动态结构,它的大小不固定,可以在程序运行时增加或减少。例10-1求范围2N中的质数,N在程序运行时由键盘输入。,容 器,#include#include#include/包含向

24、量容器头文件using namespace std;int main()vector A(10);int n;int primecount=0,i,j;cout=2 as upper limit:;cin n;Aprimecount+=2;,66,for(i=3;i i/2)Aprimecount+=i;for(i=0;iprimecount;i+)/输出质数 coutsetw(5)Ai;if(i+1)%10=0)/每输出10个数换行一次 cout endl;coutendl;,67,68,顺序容器列表,列表主要用于存放双向链表,可以从任意一端开始遍历。列表还提供了拼接(splicing)操作

25、,将一个序列中的元素从插入到另一个序列中。例从键盘输入10个整数,用这些整数值作为结点数据,生成一个链表,按顺序输出链表中结点的数值。然后从键盘输入一个待查找整数,在链表中查找该整数,若找到则删除该整数所在的结点(如果出现多次,全部删除),然后输出删除结点以后的链表。在程序结束之前清空链表。,容 器,#include#include using namespace std;int main()list Link;/构造一个列表用于存放整数链表 int i,key,item;for(i=0;i item;Link.push_front(item);coutList:;/输出链表,69,list:

26、iterator p=Link.begin();while(p!=Link.end()/输出各节点数据,直到链表尾 cout key;Link.remove(key);cout List:;/输出链表 p=Link.begin();/使P重新指向表头 while(p!=Link.end()cout*p;p+;/使P指向下一个节点 cout endl;,70,71,标准C+库中的算法,算法本身是一种函数模板不可变序列算法(Non-mutating algorithms)不直接修改所操作的容器内容的算法可变序列算法(Mutating algorithms)可以修改它们所操作的容器的元素。排序相关算法数值算法,算 法,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号