与c的区别 ppt课件_第1页
与c的区别 ppt课件_第2页
与c的区别 ppt课件_第3页
与c的区别 ppt课件_第4页
与c的区别 ppt课件_第5页
已阅读5页,还剩75页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

从C 语言到C+语言,C+的学习用书,任何一本你能接触到的C+编程书籍 谭教授的书 清华 王燕 面向对象的理论与C+实践 航空工业 赵建周 C和C+程序设计教程,C与C+的不同,C+在代码上对C的扩充 大不相同 C: 面向过程 C+:面向对象,面向过程程序设计C语言,选定数据结构、设计算法过程或函数。程序执行被看作各过程调用的序列。 面向过程编程: 程序 = 数据结构 + 算法 设计思路 自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。 炒菜吃 种菜、洗菜、切菜、炒菜,面向过程的结构化程序设计方法,缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件 把数据和处理数据的过程分离为相互独立的实体。 当数据结构改变时,所有相关的处理过程都要进行相应的修改。 每一种相对于老问题的新方法都要带来额外的开销。 图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。,面向对象程序设计C+语言,将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体对象。 对同类型对象抽象出其共性,形成类。 主要特征是各对象之间的消息传递和各类之间的继承。 类通过一个简单的外部接口,与外界发生关系。 对象与对象之间通过消息进行通信。,面向对象程序设计,一个类的集合和各类之间以继承关系联系起来的结构,再加上一个主程序,在主程序中定义各对象并规定它们之间传递消息的规律。 面向对象编程: 对象 = 数据结构 + 算法 (封装); 程序 = 对象 + 对象 + 对象 + 炒菜吃: 买净菜、按照烹调说明书炒菜,面向对象程序设计,优点: 程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。 通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。,C语言中的关键字,Auto break case char continue default do double else entry enum extern for float goto if int long register return short signed sizeof static struct switch typedef union unsigned while,C+语言中的关键字,Asm auto break case catch* cdecl char class* const continue default delete* do double else enum extern far float for friend* goto huge if inline* int interrupu long near new* operator* pascal private* protected* public* register return short signed sizeof static struct switch template* this* throw* try* typedef union unsigned virtual* void volatile while,C+ 对C的保留,C+具有对传统C语言的向后兼容性,很多已有的C程序可以稍加改造就可以重用。 虽然C+具备面向对象的处理能力,但它还是保留了很多面向过程的东西。用C+完全可以不用面向对象的思想来进行程序设计,当然人们不会这样去做除了那些只是把C+看成是C扩充的初学者。,C+对C在代码上的扩充,cout 代替 printf, scanf Printf, scanf 都必须配合%d、%f等格式控制符使用 Cout后面直接跟上操作数即可,不用格式控制符; new, delete 代替malloc, free New自动计算要分配的类型大小,省事,避免偶然错误; 它自动返回正确的指针类型,不必进行类型转换; 可以用new将分配的对象初始化;,一个简单的C+程序例子,#include #include void main() string user_name; cout user_name; cout n “ Hello, “ user_name “. and goodbye! n“; ,C+对C在代码上的扩充,引用 void swap(int &a, int &b) 作用:传递数据、不复制副本 函数重载:一物多用 int max(int a, int b, int c) long max(long a, long b, long c) float max(float a, float b, float c),几个C+的概念,面对对象技术:软件系统对现实世界的直接模拟,尽量实现将现实世界中的事物直接影射到软件系统的解空间。,现实空间问题,面向对象解空间,物质: 一辆白色的自行车 意识: 自行车,具体事物: 一个对象-自行车的实例 抽象概念: 自行车类,几个C+的概念,对象:在系统中用来描述客观事物的,其自身所具有的状态特征及可以对这些状态施加的操作结合在一起所构成的独立实体,它是用来构成系统的基本单位。 对象由一组属性和一组行为构成。 属性:用来描述对象静态特征的数据项。 行为:用来描述对象动态特征的操作序列。,几个C+的概念-对象,对象名:王东 对象的状态: 性别:男 身高:180 cm 体重:68 kg,对象的功能(可做的操作): 回答身高 回答体重 回答性别 修理电器 教计算机课,均属于自身所承受的操作,均属于施加于其他对象的操作,行为:用来描述对象动态特征的操作序列,属性:用来描述对象静态特征的数据项。,一个人,王东,男,身高180 cm,体重68 kg, 会修电器、能教计算机课。,几个C+的概念类,分类人类通常的思维方法。生活中,我们总是会把各种物体进行分类。 分类所依据的原则抽象 忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。 例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念,它们分别代表了各种不同类的物体。,几个C+的概念,类:具有相同属性和服务的一组对象的集合,是对一组客观对象的抽象,它将该组对象所具有的共同特征(包括属性特征和行为特征)集中起来,以说明该组对象的能力和性质。 如,“表”,属性特征:时、分、秒;行为特征:设定时间,显示时间。 类是多个实例的综合抽象,而实例又是类的个体实物。 利用类可以实现数据的封装、隐藏、继承与派生。,类与对象类的声明,类是一种用户自定义类型,声明形式: class 类名称 public: 公有成员(外部接口) private: 私有成员 protected: 保护型成员 Class 声明类的名称,用public、private和protected 关键字来说明类的成员的访问控制属性,最后给出成员函数的实现。,类与对象类,公有类型成员:在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。 私有类型成员:在关键字private后面声明,只允许本类中的函数访问,而类外部的任何访问都是非法的。 保护类型成员:与private类似,其差别表现在继承与派生时对派生类的影响不同。,类的一个例子,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“:“Second; ,成员函数的声明: 返回值类型 类名:函数成员名(参数表) 函数体 ,几个C+的概念,分隔符“:”:在所定义的成员函数名之前应该加上类名,中间用分隔符隔开; 类名:类成员函数 在对于类成员的访问时,使用“.”操作符: 对象名.类成员函数 或 对象名. 类名:类成员函数 定义指向此类对象的指针,在使用此类成员时,使用“-”操作符 指针 - 类成员函数,类的声明,成员数据:与一般的变量声明相同,但需要将它放在类的声明体中。 成员函数:称为“方法”,一个方法对应一个操作。可以在类中说明原型,在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。 一般而言,数据成员用private,成员函数用public只有被声明为public的方法(成员函数)才能被外界所激活 简单的成员函数的实现直接嵌入类的声明中(inline),复杂的则可写在外面。,类与对象对象,类的对象是该类的某一特定实体,即类类型的变量。 声明形式: 类名 对象名; 例: Clock myClock;,类中成员的访问方式,类中成员互访 直接使用成员名 类外访问:外界通过发“消息”来激活有关方法,所谓消息,其实就是一个命令,由程序语句来实现 使用“对象名.成员名”方式访问 public 属性的成员, 注:类外部不能访问私有性成员,只有本类中的函数可以访问 。 如: myClock. ShowTime( )就是向对象myClock发出一个消息,通知它执行display方法,一个例子,int main() Clock myClock; myClock.SetTime(8,30,30); myClock.ShowTime(); ,#include class Clock /类的声明略 /类的实现略,构造函数,构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。(在声明对象时进行的数据成员设置,称为对象的初始化。) 构造函数也是成员函数,被声明为公有型,与类名同名,无返回值。 构造函数在对象创建时由系统自动调用。 构造函数也可以被重载,在对象创建时由系统自动调用。 如果程序中未声明,则系统自动产生出一个默认形式的构造函数,该函数没有参数,不进行任何操作,构造函数举例,class Clock public: Clock(int NewH,int NewM,int NewS);/构造函数 void SetTime(int NewH,int NewM,int NewS); void ShowTime(); private: int Hour,Minute,Second; ;,构造函数的实现: Clock:Clock(int NewH, int NewM, int NewS) Hour= NewH; Minute= NewM; Second= NewS; 建立对象时构造函数的作用: int main() Clock c(0,0,0); /隐含调用构造函数,将初始值作为实参。 c.ShowTime(); ,析构函数,“清理善后”:在撤销对象时,系统自动调用析构函数(destructor),释放此对象所属的空间。 析构函数名:与类名相同,只是在函数名前面加一个“”,以区别于构造函数 只能用一个析构函数,不能重载 若用户未编写析构函数,编译系统会自动生成一个缺省的析构函数,它不进行任何操作,构造函数和析构函数举例,#include class Point public: Point(int xx,int yy); Point(); /.其他函数原型 private: int X,int Y; ;,Point:Point(int xx=0,int yy=0) X=xx; Y=yy; Point:Point() /.其他函数的实现略,Point PointA /点A(0,0) Point PointB(4,5) / B(4,5),类的应用举例1,#include class Clock /时钟类的声明 public: /外部接口,公有成员函数 void SetTime(int NewH = 0, int NewM = 0, int NewS = 0); void ShowTime(); private: /私有数据成员 int Hour, Minute, Second; ;,/时钟类成员函数的具体实现 void Clock:SetTime(int NewH, int New , Mint NewS) Hour=NewH; Minute=NewM; Second=NewS; void Clock:ShowTime() coutHour“:“Minute“:“Second; ,/主程序 Void main () clock myClook; /定义对象myClock cout“First time set and output:”endl; myClook.SetTime( ); /设置时间为默认值 myClook.ShowTime( ); /显示时间 cout“Second time set and output;”endl; myClook.SetTime(8,30,30 ); /设置时间为8:30:30 myClook.ShowTime( ); /显示时间 ,程序运行结果: First time set and output: 0:0:0 Second time set and output: 8:30:30,程序由类Clock的定义、类成员函数的实现和主函数三个独立部分组成,通过类对问题进行了高度的抽象和封闭化的描述,在主程序中声明类的实例对象并完成消息的传递从而解决了问题。,面向对象的特性,封装性 继承性 多态性,封装性,封装:将一个数据和与这个数据有关的操作集合放在一起,形成一个能动的实体-对象,用户不必知道对象行为的实现细节,只需根据对象提供的外部特性接口访问对象即可。 从用户的角度来看,这些对象的行为就象包含在一个“黑匣子”里,是隐蔽的、看不见的。,C+的封装思想,C+利用类(class)的形式来实现封装的。 具有相同结构和特性的所有对象构成一种“类型”类(class) 类是用来定义对象的一种抽象数据类型 对象(object):数据 (属性) 操作(行为) 类是对具有相同结构和特性的对象的抽象,而对象是类的具体实例(instance) 首都类:北京、巴黎、莫斯科、华盛顿 类相当于是用户自定义的数据类型,其性质和其他数据类型(如整型、实型)相同,struct student int number; char name10; char sex; float socre; ; struct student student1,student2;,只包含数据,不包含操作,C+如何封装数据和操作?,class student private: int number; char name10; float socre; public: void display( ) cout“number:”numerendl; void setnum( int a) number = a; ; student stud1,stud2,stud1.display( ),对象,类名,一般而言,数据成员用private,外界无法随意改动数据 成员函数用public,外界能够方便的访问操作数据 简单的成员函数的实现直接嵌入类的声明中(inline),复杂的则可写在外面。 声明为private的私有数据,外部无法访问;通过public的成员函数为类提供外部接口,外界只能通过这个接口来与该类发生联系。 外界通过发“消息”来激活有关方法,所谓消息,其实就是一个命令,由程序语句来实现,C+的封装,Stud1.setnum( )就是向对象stud1发出一个消息,通知它执行setnum( )方法(设定学号) stud1.display( )就是向对象stud1发出一个消息,通知它执行display方法 (显示学号) 所以,我们不必了解或改动这个“黑匣子”的具体结构和算法,只需通过接口就能方便地完成数据的通信和执行相关的操作。 通过类的机制实现了对数据的有效隐蔽,使程序中不同部分之间的相互影响减少到最低程度,增强了程序的安全性。,C+的封装,继承与派生,面向对象技术强调软件的可重用性,在C+中可重用性是通过“继承”这一机制来实现的 例:我们想在前面的学生信息中增加“年龄”“地址”等信息 是重新定义一个新的类student1? 还是在已有类student的基础上加上一些新的内容?,“长方形”继承了“形状”的全部特征,“正方形”继承了“长方形”的全部特征 “长方形”是“形状”派生出来的一个分支,“正方形”是“长方形”派生出来的一个分支,形状 shape,问题举例,继承与派生,在C+中所谓“继承”就是在一个已存在的类的基础上新增自己的特性而建立一个新的类 已存在的类称为“基类”或“父类”,新建立的类称为“派生类”或“子类” 派生类继承了基类的所有数据成员和成员函数,并增加了新的成员 继承使我们得以将一群相关的类组织起来,并让我们得以分享其间的共通数据和操作行为 保持已有类的特性而构造新类的过程称为继承。,派生类的声明,class 派生类名:继承方式 基类名 成员声明; ,三种继承方式:公有继承、私有继承、保护继承 不同继承方式的影响主要体现在: 派生类成员对基类成员的访问权限 通过派生类对象对基类成员的访问权限,class student1: public student private: int age; string address; public: void display_1() cout“age:”ageendl; cout“address:”addressendl; ;,表明student1为公用派生类,private,表明student1为私有派生类,公有继承(public),基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 通过派生类的对象只能访问基类的public成员。,私有继承(private),基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 通过派生类的对象不能直接访问基类中的任何成员。,保护继承(protected),基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。 派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。 通过派生类的对象不能直接访问基类中的任何成员,派生类的继承关系,protected 成员的特点与作用,对建立其所在类对象的模块来说,它与 private 成员的性质相同。 对于其派生类来说,它与 public 成员的性质相同。 既实现了数据隐藏,又方便继承,实现代码重用。,例 公有继承举例,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 GetX() return X; /返回X轴坐标值 float GetY() return Y; /返回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; /长、宽 ;,#include #include /数学公式的头文件 int main() Rectangle rect; rect.InitR(2,3,20,10); /设置长方形 rect.Move(3,2); /通过派生类对象访问基类公有成员 coutrect.GetX(), /2+3=5 rect.GetY(), / 3+2=5 rect.GetW(), /20 rect.GetH() endl; /10 return 0; ,多态性,同一个消息可以根据发送消息对象的不同采用不同的行为方式。 重载(overloading) :通过为函数和运算符创建附加定义而使它们的名字可以重载。也就是说相同名字的函数和运算符对不同类型的消息可以表现出不同的行为。 虚函数(Virtual):使用户在一个类等级中可以使用相同函数的多个版本。,函数重载的一个例子C中,int max1(int a, int b, int c) if (ba) a=b; if (ca) a=c; return a; ,double max2 (double a, double b, double c) ,类型不同的数据间比较需分别调用两个不同名的函数来实现。,a1、b1、c1为 int 型:max1(a1,b1,c1) a2、b2、c2为double型:max2(a2,b2,c2),函数重载的一个例子C+中,int max (int a, int b, int c) if (ba) a=b; if (ca) a=c; return a; ,double max (double a, double b, double c) if (ba) a=b; if (ca) a=c;r eturn a; ,a1、b1、c1为 int 型:max(a1,b1,c1) a2、b2、c2为double型:max(a2,b2,c2),类型不同的数据间比较可以使用同名的函数来实现,程序自动判断选择合适的类型。,运算符重载,例 8-1,将“+”、“-”运算重载为复数类的成员函数。 规则: 实部和虚部分别相加减。 操作数: 两个操作数都是复数类的对象。,#include 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() cout“(“real“,“imag“)“endl; ; /输出复数 private: /私有数据成员 double real; /复数实部 double imag; /复数虚部 ;,63,complex complex: operator +(complex c2) /重载函数实现 complex c; c.real=c2.real+real; c.imag=c2.imag+imag; return complex(c.real,c.imag); ,64,complex complex: operator -(complex c2) /重载函数实现 complex c; c.real=real-c2.real; c.imag=imag-c2.imag; return complex(c.real,c.imag); ,65,int main() /主函数 complex c1(5,4),c2(2,10),c3; /声明复数类的对象 cout“c1=“; c1.display(); cout“c2=“; c2.display(); c3=c1-c2; /使用重载运算符完成复数减法 cout“c3=c1-c2=“; c3.display(); c3=c1+c2; /使用重载运算符完成复数加法 cout“c3=c1+c2=“; c3.display(); ,66,程序输出的结果为: c1=(5,4) c2=(2,10) c3=c1-c2=(3,-6) c3=c1+c2=(7,14),67,继承中的一个问题,长方形的面积:Area=W*H; 正方形的面积:Area=L*L; 正方形从长方形继承而来,显然就有了两个同名但操作并不相同的求面积的成员函数,当计算正方形面积时,怎么样才能准确调用正方形派生类中的函数呢?,长方形 rectangle,正方形 square,继承,#include class Point public: Point(double i, double j) x=i; y=j; double Area() const return 0.0; private: double x, y; ; class Rectangle:public Point public: Rectangle(double i, double j, double k, double l); double Area() const return w*h; private: double w,h; ;,Rectangle:Rectangle(double i, double j, double k, double l) :Point(i,j) w=k; h=l; void fun(Point 运行结果: Area=0,虚函数,虚函数(Virtual):若某类中的一个成员函数被说明为虚函数,就意味着成员函数在派生类中可能存在着不同的实现 在类的声明中,在函数原型之前写virtual Virtual 函数类型 函数名(形参表) 函数体 virtual 只用来说明类声明中的原型,不能用在函数实现时。,虚函数,具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。 本质:不是重载声明而是覆盖。 调用方式:通过基类指针或引用,执行时会 根据指针指向的对象的类,决定调用哪个函数,#include class Point public: Point(double i, double j) x=i; y=j; virtual double Area() const return 0.0; / virtual:虚函数 private: double x, y; ; class Rectangle:public Point public: Rectangle(double i, double j, doubl

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论