![c-与c的区别-课件_第1页](http://file4.renrendoc.com/view/977aa229405281d73d72904e8ae287a6/977aa229405281d73d72904e8ae287a61.gif)
![c-与c的区别-课件_第2页](http://file4.renrendoc.com/view/977aa229405281d73d72904e8ae287a6/977aa229405281d73d72904e8ae287a62.gif)
![c-与c的区别-课件_第3页](http://file4.renrendoc.com/view/977aa229405281d73d72904e8ae287a6/977aa229405281d73d72904e8ae287a63.gif)
![c-与c的区别-课件_第4页](http://file4.renrendoc.com/view/977aa229405281d73d72904e8ae287a6/977aa229405281d73d72904e8ae287a64.gif)
![c-与c的区别-课件_第5页](http://file4.renrendoc.com/view/977aa229405281d73d72904e8ae287a6/977aa229405281d73d72904e8ae287a65.gif)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
从C语言到C++语言从C语言到C++语言C++的学习用书任何一本你能接触到的C++编程书籍谭教授的书清华王燕《面向对象的理论与C++实践》航空工业赵建周《C和C++程序设计教程》C++的学习用书任何一本你能接触到的C++编程书籍C与C++的不同C++在代码上对C的扩充大不相同C:面向过程C++:面向对象C与C++的不同C++在代码上对C的扩充面向过程程序设计—C语言选定数据结构、设计算法过程或函数。程序执行被看作各过程调用的序列。面向过程编程:程序=数据结构+算法设计思路自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。炒菜吃种菜、洗菜、切菜、炒菜面向过程程序设计—C语言选定数据结构、设计算法过程或函数。程面向过程的结构化程序设计方法缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改。每一种相对于老问题的新方法都要带来额外的开销。图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。面向过程的结构化程序设计方法缺点:可重用性差、数据安全性差、面向对象程序设计—C++语言将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。对同类型对象抽象出其共性,形成类。主要特征是各对象之间的消息传递和各类之间的继承。类通过一个简单的外部接口,与外界发生关系。对象与对象之间通过消息进行通信。面向对象程序设计—C++语言将数据及对数据的操作方法封装在一面向对象程序设计一个类的集合和各类之间以继承关系联系起来的结构,再加上一个主程序,在主程序中定义各对象并规定它们之间传递消息的规律。面向对象编程:对象=数据结构+算法(封装);程序=对象+对象+对象+……炒菜吃:买净菜、按照烹调说明书炒菜面向对象程序设计一个类的集合和各类之间以继承关系联系起来的结面向对象程序设计优点:程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。面向对象程序设计优点:C语言中的关键字AutobreakcasecharcontinuedefaultdodoubleelseentryenumexternforfloatgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedwhileC语言中的关键字AutobreakcasecharcC++语言中的关键字Asmautobreakcasecatch*cdeclcharclass*constcontinuedefaultdelete*dodoubleelseenumexternfarfloatforfriend*gotohugeifinline*intinterrupulongnearnew*
operator*pascalprivate*
protected*public*registerreturnshortsignedsizeofstaticstructswitchtemplate*this*throw*try*typedefunionunsignedvirtual*voidvolatilewhileC++语言中的关键字AsmautobreakcaseC++对C的保留C++具有对传统C语言的向后兼容性,很多已有的C程序可以稍加改造就可以重用。虽然C++具备面向对象的处理能力,但它还是保留了很多面向过程的东西。用C++完全可以不用面向对象的思想来进行程序设计,当然人们不会这样去做——除了那些只是把C++看成是C扩充的初学者。C++对C的保留C++具有对传统C语言的向后兼容性,很多已C++对C在代码上的扩充cout<<,cin>>代替printf,scanfPrintf,scanf都必须配合%d、%f等格式控制符使用Cout<<,cin>>后面直接跟上操作数即可,不用格式控制符;new,delete代替malloc,freeNew自动计算要分配的类型大小,省事,避免偶然错误;它自动返回正确的指针类型,不必进行类型转换;可以用new将分配的对象初始化;C++对C在代码上的扩充cout<<,cin>>代替一个简单的C++程序例子#include<iostream>#include<string>voidmain(){ stringuser_name; cout<<"Pleaseenteryourfirstname:"; cin>>user_name; cout<<'\n' <<"Hello," <<user_name <<"...andgoodbye!\n";}一个简单的C++程序例子#include<iostreamC++对C在代码上的扩充引用voidswap(int&a,int&b)作用:传递数据、不复制副本函数重载:一物多用 intmax(inta,intb,intc) longmax(longa,longb,longc) floatmax(floata,floatb,floatc)C++对C在代码上的扩充引用几个C++的概念面对对象技术:软件系统对现实世界的直接模拟,尽量实现将现实世界中的事物直接影射到软件系统的解空间。现实空间问题面向对象解空间物质:一辆白色的自行车意识:自行车具体事物:一个对象----自行车的实例抽象概念:自行车类几个C++的概念面对对象技术:软件系统对现实世界的直接模拟,几个C++的概念对象:在系统中用来描述客观事物的,其自身所具有的状态特征及可以对这些状态施加的操作结合在一起所构成的独立实体,它是用来构成系统的基本单位。对象由一组属性和一组行为构成。属性:用来描述对象静态特征的数据项。行为:用来描述对象动态特征的操作序列。几个C++的概念对象:在系统中用来描述客观事物的,其自身所具几个C++的概念--对象对象名:王东对象的状态: 性别:男 身高:180cm 体重:68kg对象的功能(可做的操作):回答身高回答体重回答性别修理电器教计算机课均属于自身所承受的操作均属于施加于其他对象的操作行为:用来描述对象动态特征的操作序列属性:用来描述对象静态特征的数据项。一个人,王东,男,身高180cm,体重68kg,会修电器、能教计算机课。几个C++的概念--对象对象名:王东对象的功能(可做的操作)几个C++的概念—类分类——人类通常的思维方法。生活中,我们总是会把各种物体进行分类。分类所依据的原则——抽象忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念,它们分别代表了各种不同类的物体。几个C++的概念—类分类——人类通常的思维方法。生活中,我们几个C++的概念类:具有相同属性和服务的一组对象的集合,是对一组客观对象的抽象,它将该组对象所具有的共同特征(包括属性特征和行为特征)集中起来,以说明该组对象的能力和性质。如,“表”,属性特征:时、分、秒;行为特征:设定时间,显示时间。类是多个实例的综合抽象,而实例又是类的个体实物。利用类可以实现数据的封装、隐藏、继承与派生。几个C++的概念类:具有相同属性和服务的一组对象的集合,是对类与对象—类的声明类是一种用户自定义类型,声明形式:class类名称{public:公有成员(外部接口)private:私有成员protected:保护型成员}Class声明类的名称,用public、private和protected关键字来说明类的成员的访问控制属性,最后给出成员函数的实现。类与对象—类的声明类是一种用户自定义类型,声明形式:类与对象—类公有类型成员:在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。私有类型成员:在关键字private后面声明,只允许本类中的函数访问,而类外部的任何访问都是非法的。保护类型成员:与private类似,其差别表现在继承与派生时对派生类的影响不同。类与对象—类公有类型成员:在关键字public后面声明,它们类的一个例子classClock{public:
voidSetTime(intNewH,intNewM,intNewS);
voidShowTime();private:intHour,Minute,Second;};成员数据(属性)成员函数(行为)类的一个例子classClock成员数据(属性)成员函数voidClock::SetTime(intNewH,intNewM,intNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}成员函数的声明:返回值类型类名::函数成员名(参数表){函数体}voidClock::SetTime(intNewH,几个C++的概念分隔符“::”:在所定义的成员函数名之前应该加上类名,中间用分隔符隔开;类名::类成员函数在对于类成员的访问时,使用“.”操作符:对象名.类成员函数或对象名.类名::类成员函数定义指向此类对象的指针,在使用此类成员时,使用“->”操作符指针->类成员函数几个C++的概念分隔符“::”:在所定义的成员函数名之前应该类的声明成员数据:与一般的变量声明相同,但需要将它放在类的声明体中。成员函数:称为“方法”,一个方法对应一个操作。可以在类中说明原型,在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。一般而言,数据成员用private,成员函数用public只有被声明为public的方法(成员函数)才能被外界所激活简单的成员函数的实现直接嵌入类的声明中(inline),复杂的则可写在外面。类的声明成员数据:与一般的变量声明相同,但需要将它放在类的声类与对象—对象类的对象是该类的某一特定实体,即类类型的变量。声明形式:
类名对象名;例:
ClockmyClock;类与对象—对象类的对象是该类的某一特定实体,即类类型的变量。类中成员的访问方式类中成员互访直接使用成员名类外访问:外界通过发“消息”来激活有关方法,所谓消息,其实就是一个命令,由程序语句来实现使用“对象名.成员名”方式访问public属性的成员,注:类外部不能访问私有性成员,只有本类中的函数可以访问。如:myClock.ShowTime()就是向对象myClock发出一个消息,通知它执行display方法类中成员的访问方式类中成员互访一个例子intmain(){ClockmyClock;myClock.SetTime(8,30,30);myClock.ShowTime();}#include<iostream>classClock{......//类的声明略}//......类的实现略一个例子intmain()#include<iostrea构造函数构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。(在声明对象时进行的数据成员设置,称为对象的初始化。)构造函数也是成员函数,被声明为公有型,与类名同名,无返回值。构造函数在对象创建时由系统自动调用。构造函数也可以被重载,在对象创建时由系统自动调用。如果程序中未声明,则系统自动产生出一个默认形式的构造函数,该函数没有参数,不进行任何操作构造函数构造函数的作用是在对象被创建时使用特定的值构造对象,构造函数举例classClock{public:
Clock(intNewH,intNewM,intNewS);//构造函数 voidSetTime(intNewH,intNewM,intNewS); voidShowTime();private: intHour,Minute,Second;};构造函数举例classClock构造函数的实现:Clock::Clock(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}建立对象时构造函数的作用:intmain(){
Clockc(0,0,0);//隐含调用构造函数,将初始值作为实参。c.ShowTime();}构造函数的实现:析构函数“清理善后”:在撤销对象时,系统自动调用析构函数(destructor),释放此对象所属的空间。析构函数名:与类名相同,只是在函数名前面加一个“~”,以区别于构造函数只能用一个析构函数,不能重载若用户未编写析构函数,编译系统会自动生成一个缺省的析构函数,它不进行任何操作析构函数“清理善后”:在撤销对象时,系统自动调用析构函数(d构造函数和析构函数举例#include<iostream>classPoint{public:Point(intxx,intyy);~Point();//...其他函数原型private:intX,intY;};Point::Point(intxx=0,intyy=0){X=xx;Y=yy;}Point::~Point(){}//...其他函数的实现略PointPointA //点A(0,0)PointPointB(4,5) //B(4,5)构造函数和析构函数举例#include<iostream>P类的应用举例1#include<iostream.h>classClock//时钟类的声明{public://外部接口,公有成员函数voidSetTime(intNewH=0,intNewM=0,intNewS=0);
voidShowTime();private://私有数据成员intHour,Minute,Second;};类的应用举例1#include<iostream.h>//时钟类成员函数的具体实现voidClock::SetTime(intNewH,intNew,MintNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}//时钟类成员函数的具体实现//主程序Voidmain() {clockmyClook; //定义对象myClockcout<<“Firsttimesetandoutput:”<<endl;myClook.SetTime();//设置时间为默认值myClook.ShowTime(); //显示时间cout<<“Secondtimesetandoutput;”<<endl;myClook.SetTime(8,30,30); //设置时间为8:30:30myClook.ShowTime(); //显示时间}//主程序程序运行结果:Firsttimesetandoutput:0:0:0Secondtimesetandoutput:8:30:30程序由类Clock的定义、类成员函数的实现和主函数三个独立部分组成,通过类对问题进行了高度的抽象和封闭化的描述,在主程序中声明类的实例—对象并完成消息的传递从而解决了问题。程序运行结果:程序由类Clock的定义、类成员函数的实现和主面向对象的特性封装性继承性多态性面向对象的特性封装性封装性封装:将一个数据和与这个数据有关的操作集合放在一起,形成一个能动的实体----对象,用户不必知道对象行为的实现细节,只需根据对象提供的外部特性接口访问对象即可。从用户的角度来看,这些对象的行为就象包含在一个“黑匣子”里,是隐蔽的、看不见的。封装性封装:将一个数据和与这个数据有关的操作集合放在一起,形C++的封装思想C++利用类(class)的形式来实现封装的。具有相同结构和特性的所有对象构成一种“类型”——类(class)类是用来定义对象的一种抽象数据类型对象(object):数据(属性)+操作(行为)类是对具有相同结构和特性的对象的抽象,而对象是类的具体实例(instance)首都类:北京、巴黎、莫斯科、华盛顿…类相当于是用户自定义的数据类型,其性质和其他数据类型(如整型、实型…)相同C++的封装思想C++利用类(class)的形式来实现封装的structstudent
{
intnumber;charname[10];charsex;
floatsocre;
};structstudentstudent1,student2;只包含数据,不包含操作structstudent
{
intnumbC++如何封装数据和操作?classstudent
{private:
intnumber;
charname[10];
floatsocre;
public:
voiddisplay()
{cout<<“number:”<<numer<<endl;……}
voidsetnum(inta)
{number=a;}
};studentstud1,stud2stud1.display()对象类名数据成员成员函数C++如何封装数据和操作?classstudent
{一般而言,数据成员用private,外界无法随意改动数据成员函数用public,外界能够方便的访问操作数据简单的成员函数的实现直接嵌入类的声明中(inline),复杂的则可写在外面。声明为private的私有数据,外部无法访问;通过public的成员函数为类提供外部接口,外界只能通过这个接口来与该类发生联系。外界通过发“消息”来激活有关方法,所谓消息,其实就是一个命令,由程序语句来实现C++的封装一般而言,数据成员用private,外界无法随意改动数据C+Stud1.setnum()就是向对象stud1发出一个消息,通知它执行setnum()方法(设定学号)stud1.display()就是向对象stud1发出一个消息,通知它执行display方法(显示学号)所以,我们不必了解或改动这个“黑匣子”的具体结构和算法,只需通过接口就能方便地完成数据的通信和执行相关的操作。通过类的机制实现了对数据的有效隐蔽,使程序中不同部分之间的相互影响减少到最低程度,增强了程序的安全性。C++的封装Stud1.setnum()就是向对象stud1发出一个消继承与派生面向对象技术强调软件的可重用性,在C++中可重用性是通过“继承”这一机制来实现的例:我们想在前面的学生信息中增加“年龄”“地址”等信息是重新定义一个新的类student1?还是在已有类student的基础上加上一些新的内容?继承与派生面向对象技术强调软件的可重用性,在C++中可重用性“长方形”继承了“形状”的全部特征,“正方形”继承了“长方形”的全部特征“长方形”是“形状”派生出来的一个分支,“正方形”是“长方形”派生出来的一个分支形状shape椭圆形ellipse长方形rectangle三角形triangle圆形circle正方形square直角三角形钝角三角形锐角三角形形状椭圆形长方形三角形圆形正方形直角钝角锐角问题举例问题举例继承与派生在C++中所谓“继承”就是在一个已存在的类的基础上新增自己的特性而建立一个新的类已存在的类称为“基类”或“父类”,新建立的类称为“派生类”或“子类”派生类继承了基类的所有数据成员和成员函数,并增加了新的成员继承使我们得以将一群相关的类组织起来,并让我们得以分享其间的共通数据和操作行为保持已有类的特性而构造新类的过程称为继承。继承与派生在C++中所谓“继承”就是在一个已存在的类的基础上派生类的声明class派生类名:继承方式基类名{成员声明;}三种继承方式:公有继承、私有继承、保护继承不同继承方式的影响主要体现在: 派生类成员对基类成员的访问权限 通过派生类对象对基类成员的访问权限派生类的声明class派生类名:继承方式基类名三种继承classstudent1:publicstudent{
private:
intage;
stringaddress;
public:
voiddisplay_1(){cout<<“age:”<<age<<endl;cout<<“address:”<<address<<endl;}};表明student1为公用派生类private表明student1为私有派生类classstudent1:publicstudent公有继承(public)基类的public和protected成员的访问属性在派生类中保持不变,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象只能访问基类的public成员。公有继承(public)基类的public和protecte私有继承(private)基类的public和protected成员都以private身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员。私有继承(private)基类的public和protect保护继承(protected)基类的public和protected成员都以protected身份出现在派生类中,但基类的private成员不可直接访问。派生类中的成员函数可以直接访问基类中的public和protected成员,但不能直接访问基类的private成员。通过派生类的对象不能直接访问基类中的任何成员保护继承(protected)基类的public和prote派生类的继承关系基类私有(private)成员公用(public)成员保护(protected)成员公用(public)派生类不可访问的成员公用成员保护成员私有(private)派生类不可访问的成员私有成员私有成员派生类的继承关系基类私有(private)成员公用(publprotected成员的特点与作用对建立其所在类对象的模块来说,它与private成员的性质相同。对于其派生类来说,它与public成员的性质相同。既实现了数据隐藏,又方便继承,实现代码重用。protected成员的特点与作用对建立其所在类对象的模块例公有继承举例classPoint //基类Point类的声明{public: //公有函数成员
voidInitP(floatxx=0,floatyy=0) //构造函数初始化{X=xx;Y=yy;}
voidMove(floatxOff,floatyOff) //移动该点{X+=xOff;Y+=yOff;}
floatGetX(){returnX;} //返回X轴坐标值 floatGetY(){returnY;} //返回Y轴坐标值private: //私有数据成员 floatX,Y;};例公有继承举例classPoint //基类PoinclassRectangle:publicPoint//派生类声明(长方形类){public: //新增公有函数成员
voidInitR(floatx,floaty,floatw,floath)//设置长方形 {InitP(x,y);W=w;H=h;} //调用基类公有成员函数 floatGetH(){returnH;} //返回长方形的高 floatGetW(){returnW;} //返回长方形的宽private: //新增私有数据成员
floatW,H; //长、宽};classRectangle:publicPoint#include<iostream>#include<cmath> //数学公式的头文件intmain(){Rectanglerect; rect.InitR(2,3,20,10); //设置长方形 rect.Move(3,2); //通过派生类对象访问基类公有成员 cout<<rect.GetX()<<',‘ //2+3=5 <<rect.GetY()<<',‘ //3+2=5 <<rect.GetW()<<',‘ //20<<rect.GetH()<<endl; //10 return0;}#include<iostream>多态性同一个消息可以根据发送消息对象的不同采用不同的行为方式。重载(overloading)
:通过为函数和运算符创建附加定义而使它们的名字可以重载。也就是说相同名字的函数和运算符对不同类型的消息可以表现出不同的行为。虚函数(Virtual):使用户在一个类等级中可以使用相同函数的多个版本。多态性同一个消息可以根据发送消息对象的不同采用不同的行为方式函数重载的一个例子—C中intmax1(inta,intb,intc){ if(b>a)a=b; if(c>a)a=c; returna;}double
max2(doublea,doubleb,doublec){……}类型不同的数据间比较需分别调用两个不同名的函数来实现。a1、b1、c1为int型:max1(a1,b1,c1)a2、b2、c2为double型:max2(a2,b2,c2)函数重载的一个例子—C中intmax1(inta,in函数重载的一个例子——C++中intmax(inta,intb,intc){ if(b>a)a=b; if(c>a)a=c; returna;}doublemax(doublea,doubleb,doublec){
if(b>a)a=b; if(c>a)a=c;r eturna;}a1、b1、c1为int型:max(a1,b1,c1)a2、b2、c2为double型:max(a2,b2,c2)类型不同的数据间比较可以使用同名的函数来实现,程序自动判断选择合适的类型。函数重载的一个例子——C++中intmax(inta,运算符重载例8-1将“+”、“-”运算重载为复数类的成员函数。规则:实部和虚部分别相加减。操作数:两个操作数都是复数类的对象。运算符重载例8-1将“+”、“-”运算#include<iostream>classcomplex //复数类声明{public: //外部接口 complex(doubler=0.0,doublei=0.0){real=r;imag=i;}
//构造函数 complexoperator+(complexc2);//+重载为成员函数 complexoperator-(complexc2);//-重载为成员函数 voiddisplay(){cout<<"("<<real<<","<<imag<<")"<<endl;}; //输出复数private: //私有数据成员 doublereal; //复数实部 doubleimag; //复数虚部}; 63#include<iostream>63complexcomplex::
operator+(complexc2)//重载函数实现{ complexc;
c.real=c2.real+real; c.imag=c2.imag+imag; returncomplex(c.real,c.imag);}64complexcomplex::
operator+(ccomplexcomplex::
operator-(complexc2)//重载函数实现{ complexc;
c.real=real-c2.real; c.imag=imag-c2.imag; returncomplex(c.real,c.imag);}65complexcomplex::
operator-(cintmain()//主函数{ complexc1(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();}66intmain()//主函数66程序输出的结果为:c1=(5,4)c2=(2,10)c3=c1-c2=(3,-6)c3=c1+c2=(7,14)67程序输出的结果为:67继承中的一个问题长方形的面积:Area=W*H;正方形的面积:Area=L*L;正方形从长方形继承而来,显然就有了两个同名但操作并不相同的求面积的成员函数,当计算正方形面积时,怎么样才能准确调用正方形派生类中的函数呢?长方形rectangle正方形square继承继承中的一个问题长方形的面积:Area=W*H;长方形正方形#include<iostream> classPoint{public: Point(doublei,doublej){x=i;y=j;} doubleArea()const{return0.0;}private: doublex,y;};classRectangle:publicPoint{public: Rectangle(doublei,doublej,doublek,doublel); doubleArea()const{returnw*h;}private: doublew,h;};#include<iostream> Rectangle::Rectangle(doublei,doublej,doublek,doublel):Point(i,j){ w=k;h=l;}voidfun(Point&s) //&s用到了引用{ cout<<"Area="<<s.Area()<<endl;}intmain(){
Rectanglerec(3.0,5.2,15.0,25.0); fun(rec);}运行结果:Area=0Rectangle::Rectangle(doublei,虚函数虚函数(Virtual):若某类中的一个成员函数被说明为虚函数,就意味着成员函数在派生类中可能存在着不同的实现在类的声明中,在函数原型之前写virtualVirtual函数类型函数名(形参表){ 函数体}virtual只用来说明类声明中的原型,不能用在函数实现时。虚函数虚函数(Virtual):若某类中的一个成员函数被说明虚函数具有继承性,基类中声明了虚函数,派生类中无论是否说明,同原型函数都自动为虚函数。本质:不是重载声明而是覆盖。调用方式:通过基类指针或引用,执行时会
根据指针指向的对象的类,决定调用哪个函数虚函数#include<iostream>classPoint{public: Point(doublei,doublej){x=i;y=j;}
virtualdoubleArea()const{return0.0;} //virtual:虚函数private: doublex,y;};classRectangle:publicPoint{public: Rectangle(doublei,doublej,doublek,doublel);
virtualdoubleArea()const{returnw*h;} //virtual:虚函数private: doublew,h;};//其他函数同上例#include<iostream>voidfun(Point&s){ cout<<"Area="<<s.Area()<<endl;}intmain(){ Rectanglerec(3.0,5.2,15.0,25.0); fun(rec);}运行结果:Area=375voidfun(Point&s)intmax(inta,intb,intc){if(b>a)a=b;
if(c>a)a=c;
returna;}模板(template)doublemax(floata,floatb,floatc){ if(b>a)a=b;
if(c>a)a=c;
returna;}这两个重载的函数,有很多相同的代码,能不能充分利用这些相同的代码?提高软件的开发效率intmax(inta,intb,intc)模板函数模板函数模板可以用来创建一个通用功能的函数,以支持多种不同的形参,简化重载函数的函数体设计。函数模版定义形式为: template<typename标识符> 函数定义函数模板函数模板可以用来创建一个通用功能的函数,以支持多种不函数模板(template)template<typenameT>Tmax(Ta,Tb,Tc){if(b>a)a=b;
if(c>a)a=c;
returna;}max就是函数模板Voidmain(){inta1=10,a2=15,a3=20;doublea1=1.5,a2=5.5,a3=2.3;max(a1,b1,c1)max(a2,b2,c2)}编译器从调用max()时实参的类型自动推导出函数模板的类型参数。实际执行:intmax(inta,intb,intc)doublemax(floata,floatb,floatc)函数模板(template)template<typenam类模板同样,使用类模板使用户为类声明一种模式,使得类中某些数据成员、某些成员函数的参数、某些成员函数的返回值能取任意类型,提高代码使用率。类模板声明如下: template<class标识符> 类说明注意:模板类的成员函数必须是函数模板模板类建立对象时,声明形式如下: 类模板名<class标识符>对象名1,对象名2……类模板同样,使用类模板使用户为类声明一种模式,使得类中某些数类模板(template)178264131829PiglEeyoRooChriKanPootTigg二叉树:由结点组成,每一个节点包括值及其深度,以及下一级左右节点的位置。类模板(template)178264131829PiglEclassstring_BTnode{public:……private:
stringval;intcnt;string_BTnode*lchild;string_BTnode*rchild;}classint_BTnode{public:……private:
intval;intcnt;int_BTnode*lchild;int_BTnode*rchild;}template
<class
valType>classBTnode{public:……private:valTypeval;intcnt;int_BTnode*lchild;int_BTnode*rchild;}valType可以被任意设定来建立对象,如BTnode<int>bti;或BTnode<string>bts;BTnode就是类模板classstring_BTnode{classint从C语言到C++语言从C语言到C++语言C++的学习用书任何一本你能接触到的C++编程书籍谭教授的书清华王燕《面向对象的理论与C++实践》航空工业赵建周《C和C++程序设计教程》C++的学习用书任何一本你能接触到的C++编程书籍C与C++的不同C++在代码上对C的扩充大不相同C:面向过程C++:面向对象C与C++的不同C++在代码上对C的扩充面向过程程序设计—C语言选定数据结构、设计算法过程或函数。程序执行被看作各过程调用的序列。面向过程编程:程序=数据结构+算法设计思路自顶向下、逐步求精。采用模块分解与功能抽象,自顶向下、分而治之。炒菜吃种菜、洗菜、切菜、炒菜面向过程程序设计—C语言选定数据结构、设计算法过程或函数。程面向过程的结构化程序设计方法缺点:可重用性差、数据安全性差、难以开发大型软件和图形界面的应用软件把数据和处理数据的过程分离为相互独立的实体。当数据结构改变时,所有相关的处理过程都要进行相应的修改。每一种相对于老问题的新方法都要带来额外的开销。图形用户界面的应用程序,很难用过程来描述和实现,开发和维护也都很困难。面向过程的结构化程序设计方法缺点:可重用性差、数据安全性差、面向对象程序设计—C++语言将数据及对数据的操作方法封装在一起,作为一个相互依存、不可分离的整体——对象。对同类型对象抽象出其共性,形成类。主要特征是各对象之间的消息传递和各类之间的继承。类通过一个简单的外部接口,与外界发生关系。对象与对象之间通过消息进行通信。面向对象程序设计—C++语言将数据及对数据的操作方法封装在一面向对象程序设计一个类的集合和各类之间以继承关系联系起来的结构,再加上一个主程序,在主程序中定义各对象并规定它们之间传递消息的规律。面向对象编程:对象=数据结构+算法(封装);程序=对象+对象+对象+……炒菜吃:买净菜、按照烹调说明书炒菜面向对象程序设计一个类的集合和各类之间以继承关系联系起来的结面向对象程序设计优点:程序模块间的关系更为简单,程序模块的独立性、数据的安全性就有了良好的保障。通过继承与多态性,可以大大提高程序的可重用性,使得软件的开发和维护都更为方便。面向对象程序设计优点:C语言中的关键字AutobreakcasecharcontinuedefaultdodoubleelseentryenumexternforfloatgotoifintlongregisterreturnshortsignedsizeofstaticstructswitchtypedefunionunsignedwhileC语言中的关键字AutobreakcasecharcC++语言中的关键字Asmautobreakcasecatch*cdeclcharclass*constcontinuedefaultdelete*dodoubleelseenumexternfarfloatforfriend*gotohugeifinline*intinterrupulongnearnew*
operator*pascalprivate*
protected*public*registerreturnshortsignedsizeofstaticstructswitchtemplate*this*throw*try*typedefunionunsignedvirtual*voidvolatilewhileC++语言中的关键字AsmautobreakcaseC++对C的保留C++具有对传统C语言的向后兼容性,很多已有的C程序可以稍加改造就可以重用。虽然C++具备面向对象的处理能力,但它还是保留了很多面向过程的东西。用C++完全可以不用面向对象的思想来进行程序设计,当然人们不会这样去做——除了那些只是把C++看成是C扩充的初学者。C++对C的保留C++具有对传统C语言的向后兼容性,很多已C++对C在代码上的扩充cout<<,cin>>代替printf,scanfPrintf,scanf都必须配合%d、%f等格式控制符使用Cout<<,cin>>后面直接跟上操作数即可,不用格式控制符;new,delete代替malloc,freeNew自动计算要分配的类型大小,省事,避免偶然错误;它自动返回正确的指针类型,不必进行类型转换;可以用new将分配的对象初始化;C++对C在代码上的扩充cout<<,cin>>代替一个简单的C++程序例子#include<iostream>#include<string>voidmain(){ stringuser_name; cout<<"Pleaseenteryourfirstname:"; cin>>user_name; cout<<'\n' <<"Hello," <<user_name <<"...andgoodbye!\n";}一个简单的C++程序例子#include<iostreamC++对C在代码上的扩充引用voidswap(int&a,int&b)作用:传递数据、不复制副本函数重载:一物多用 intmax(inta,intb,intc) longmax(longa,longb,longc) floatmax(floata,floatb,floatc)C++对C在代码上的扩充引用几个C++的概念面对对象技术:软件系统对现实世界的直接模拟,尽量实现将现实世界中的事物直接影射到软件系统的解空间。现实空间问题面向对象解空间物质:一辆白色的自行车意识:自行车具体事物:一个对象----自行车的实例抽象概念:自行车类几个C++的概念面对对象技术:软件系统对现实世界的直接模拟,几个C++的概念对象:在系统中用来描述客观事物的,其自身所具有的状态特征及可以对这些状态施加的操作结合在一起所构成的独立实体,它是用来构成系统的基本单位。对象由一组属性和一组行为构成。属性:用来描述对象静态特征的数据项。行为:用来描述对象动态特征的操作序列。几个C++的概念对象:在系统中用来描述客观事物的,其自身所具几个C++的概念--对象对象名:王东对象的状态: 性别:男 身高:180cm 体重:68kg对象的功能(可做的操作):回答身高回答体重回答性别修理电器教计算机课均属于自身所承受的操作均属于施加于其他对象的操作行为:用来描述对象动态特征的操作序列属性:用来描述对象静态特征的数据项。一个人,王东,男,身高180cm,体重68kg,会修电器、能教计算机课。几个C++的概念--对象对象名:王东对象的功能(可做的操作)几个C++的概念—类分类——人类通常的思维方法。生活中,我们总是会把各种物体进行分类。分类所依据的原则——抽象忽略事物的非本质特征,只注意那些与当前目标有关的本质特征,从而找出事物的共性,把具有共同性质的事物划分为一类,得出一个抽象的概念。例如,石头、树木、汽车、房屋等都是人们在长期的生产和生活实践中抽象出的概念,它们分别代表了各种不同类的物体。几个C++的概念—类分类——人类通常的思维方法。生活中,我们几个C++的概念类:具有相同属性和服务的一组对象的集合,是对一组客观对象的抽象,它将该组对象所具有的共同特征(包括属性特征和行为特征)集中起来,以说明该组对象的能力和性质。如,“表”,属性特征:时、分、秒;行为特征:设定时间,显示时间。类是多个实例的综合抽象,而实例又是类的个体实物。利用类可以实现数据的封装、隐藏、继承与派生。几个C++的概念类:具有相同属性和服务的一组对象的集合,是对类与对象—类的声明类是一种用户自定义类型,声明形式:class类名称{public:公有成员(外部接口)private:私有成员protected:保护型成员}Class声明类的名称,用public、private和protected关键字来说明类的成员的访问控制属性,最后给出成员函数的实现。类与对象—类的声明类是一种用户自定义类型,声明形式:类与对象—类公有类型成员:在关键字public后面声明,它们是类与外部的接口,任何外部函数都可以访问公有类型数据和函数。私有类型成员:在关键字private后面声明,只允许本类中的函数访问,而类外部的任何访问都是非法的。保护类型成员:与private类似,其差别表现在继承与派生时对派生类的影响不同。类与对象—类公有类型成员:在关键字public后面声明,它们类的一个例子classClock{public:
voidSetTime(intNewH,intNewM,intNewS);
voidShowTime();private:intHour,Minute,Second;};成员数据(属性)成员函数(行为)类的一个例子classClock成员数据(属性)成员函数voidClock::SetTime(intNewH,intNewM,intNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}成员函数的声明:返回值类型类名::函数成员名(参数表){函数体}voidClock::SetTime(intNewH,几个C++的概念分隔符“::”:在所定义的成员函数名之前应该加上类名,中间用分隔符隔开;类名::类成员函数在对于类成员的访问时,使用“.”操作符:对象名.类成员函数或对象名.类名::类成员函数定义指向此类对象的指针,在使用此类成员时,使用“->”操作符指针->类成员函数几个C++的概念分隔符“::”:在所定义的成员函数名之前应该类的声明成员数据:与一般的变量声明相同,但需要将它放在类的声明体中。成员函数:称为“方法”,一个方法对应一个操作。可以在类中说明原型,在类外给出函数体实现,并在函数名前使用类名加以限定。也可以直接在类中给出函数体,形成内联成员函数。一般而言,数据成员用private,成员函数用public只有被声明为public的方法(成员函数)才能被外界所激活简单的成员函数的实现直接嵌入类的声明中(inline),复杂的则可写在外面。类的声明成员数据:与一般的变量声明相同,但需要将它放在类的声类与对象—对象类的对象是该类的某一特定实体,即类类型的变量。声明形式:
类名对象名;例:
ClockmyClock;类与对象—对象类的对象是该类的某一特定实体,即类类型的变量。类中成员的访问方式类中成员互访直接使用成员名类外访问:外界通过发“消息”来激活有关方法,所谓消息,其实就是一个命令,由程序语句来实现使用“对象名.成员名”方式访问public属性的成员,注:类外部不能访问私有性成员,只有本类中的函数可以访问。如:myClock.ShowTime()就是向对象myClock发出一个消息,通知它执行display方法类中成员的访问方式类中成员互访一个例子intmain(){ClockmyClock;myClock.SetTime(8,30,30);myClock.ShowTime();}#include<iostream>classClock{......//类的声明略}//......类的实现略一个例子intmain()#include<iostrea构造函数构造函数的作用是在对象被创建时使用特定的值构造对象,或者说将对象初始化为一个特定的状态。(在声明对象时进行的数据成员设置,称为对象的初始化。)构造函数也是成员函数,被声明为公有型,与类名同名,无返回值。构造函数在对象创建时由系统自动调用。构造函数也可以被重载,在对象创建时由系统自动调用。如果程序中未声明,则系统自动产生出一个默认形式的构造函数,该函数没有参数,不进行任何操作构造函数构造函数的作用是在对象被创建时使用特定的值构造对象,构造函数举例classClock{public:
Clock(intNewH,intNewM,intNewS);//构造函数 voidSetTime(intNewH,intNewM,intNewS); voidShowTime();private: intHour,Minute,Second;};构造函数举例classClock构造函数的实现:Clock::Clock(intNewH,intNewM,intNewS){ Hour=NewH; Minute=NewM; Second=NewS;}建立对象时构造函数的作用:intmain(){
Clockc(0,0,0);//隐含调用构造函数,将初始值作为实参。c.ShowTime();}构造函数的实现:析构函数“清理善后”:在撤销对象时,系统自动调用析构函数(destructor),释放此对象所属的空间。析构函数名:与类名相同,只是在函数名前面加一个“~”,以区别于构造函数只能用一个析构函数,不能重载若用户未编写析构函数,编译系统会自动生成一个缺省的析构函数,它不进行任何操作析构函数“清理善后”:在撤销对象时,系统自动调用析构函数(d构造函数和析构函数举例#include<iostream>classPoint{public:Point(intxx,intyy);~Point();//...其他函数原型private:intX,intY;};Point::Point(intxx=0,intyy=0){X=xx;Y=yy;}Point::~Point(){}//...其他函数的实现略PointPointA //点A(0,0)PointPointB(4,5) //B(4,5)构造函数和析构函数举例#include<iostream>P类的应用举例1#include<iostream.h>classClock//时钟类的声明{public://外部接口,公有成员函数voidSetTime(intNewH=0,intNewM=0,intNewS=0);
voidShowTime();private://私有数据成员intHour,Minute,Second;};类的应用举例1#include<iostream.h>//时钟类成员函数的具体实现voidClock::SetTime(intNewH,intNew,MintNewS){Hour=NewH;Minute=NewM;Second=NewS;}voidClock::ShowTime(){cout<<Hour<<":"<<Minute<<":"<<Second;}//时钟类成员函数的具体实现//主程序Voidmain() {clockmyClook; //定义对象myClockcout<<“Firsttimesetandoutput:”<<endl;myClook.SetTime();//设置时间为默认值myClook.ShowTime(); //显示时间cout<<“Secondtimesetandoutput;”<<endl;myClook.SetTime(8,30,30); //设置时间为8:30:30myClook.ShowTime(); //显示时间}//主程序程序运行结果:Firsttimesetandoutput:0:0:0Secondtimesetandoutput:8:30:30程序由类Clock的定义、类成员函数的实现和主函数三个独立部分组成,通过类对问题进行了高度的抽象和封闭化的描述,在主程序中声明类的实例—对象并完成消息的传递从而解决了问题。程序运行结果:程序由类Clock的定义、类成员函数的实现和主面向对象的特性封装性继承性多态性面向对象的特性封装性封装性封装:将一个数据和与这个数据有关的操作集合放在一起,形成一个能动的实体----对象,用户不必知道对象行为的实现细节,只需根据对象提供的外部特性接口访问对象即可。从用户的角度来看,这些对象的行为就象包含在一个“黑匣子”里,是隐蔽的、看不见的。封装性封装:将一个数据和与这个数据有关的操作集合放在一起,形C++的封装思想C++利用类(class)的形式来实现封装的。具有相同结构和特性的所有对象构成一种“类型”——类(class)类是用来定义对象的一种抽象数据类型对象(object):数据(属性)+操作(行为)类是对具有相同结构和特性的对象的抽象,而对象是类的具体实例(instance)首都类:北京、巴黎、莫斯科、华盛顿…类相当于是用户自定义的数据类型,其性质和其他数据类型(如整型、实型…)相同C++的封装思想C++利用类(class)的形式来实现封装的structstudent
{
intnumber;charname[10];charsex;
floatsocre;
};structstudentstudent1,student2;只包含数据,不包含操作structstudent
{
intnumbC++如何封装数据和操作?classstudent
{private:
intnumber;
charname[10];
floatsocre;
public:
voiddisplay()
{cout<<“number:”<<numer<<endl;……}
voidsetnum(inta)
{number=a;}
};studentstud1,stud2stud1.display()对象类名数据成员成员函数C++如何封装数据和操作?classstudent
{一般而言,数据成员用private,外界无法随意改动数据成员函数用public,外界能够方便的访问操作数据简单的成员函数的实现直接嵌入类的声明中(inline),复杂的则可写在外面。声明为private的私有数据,外部无法访问;通过public的成员函数为类提供外部接口,外界只能通过这个接口来与该类发生联系。外界通过发“消息”来激活有关方法,所谓消息,其实就是一个命令,由程序语句来实现C++的封装一般而言,数据成员用private,外界无法随意改动数据C+Stud1.setnum()就是向对象stud1发出一个消息,通知它执行setnum()方法(设定学号)stud1.display()就是向对象stud1发出一个消息,通知它执行display方法(显示学号)所以,我们不必了解或改动这个“黑匣子”的具体结构和算法,只需通过接口就能方便地完成数据的通信和执行相关的操作。通过类的机制实现了对数据的有效隐蔽,使程序中不同部分之间的相互影响减少到最低程度,增强了程序的安全性。C++的封装Stud1.setnum()就是向对象stud1发出一个消继承与派生面向对象技术强调软件的可重用性,在C++中可重用性是通过“继承”这一机制来实现的例:我们想在前面的学生信息中增加“年龄”“地址”等信息是重新定义一个新的类student1?还是在已有类student的基础上加上一些新的内容?继承与派生面向对象技术强调软件的可重用性,在C++中可重用性“长方形”继承了“形状”的全部特征,“正方形”继承了“长方形”的全部特征“长方形”是“形状”派生出来的一个分支,“正方形”是“长方形”派生出来的一个分支形状shape椭圆形ellipse长方形rectangle三角形triangle圆形circle正方形square直角三角形钝角三角形锐角三角形形状椭圆形长方形三角形圆形正方形直角钝角锐角问题举例问题举例继承与派生在C++中所谓“继承”就是在一个已存在的类的基础上新增自己的特性而建立一个新的类已存在的类称为“基类”或“父类”,新建立的类称为“派生类”或“子类”派生类继承了基类的所有数据成员和成员函数,并增加了新的成员继承使我们得以将一群相关的类组织起来,并让我们得以分享其间的共通数据和操作行为保持已有类的特性而构造新类的过程称为继承。继承与派生在C++中所谓“继承”就是在一个已存在的类的基础上派生类的声明class派生类名:继承方式基类名{成员声明;}三种继承方式:公有继承、私有继承、保护继承不同继承方式的影响主要体现在: 派生类成员对基类成员的访问权限 通过派生类对象对基类成员的访问权限派生类的声明class派生类名:继承方式基类名三种继承classstudent1:publ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年度地下空间开发施工合同规范文本
- 2025年度印刷材料行业环保型采购与生产合同
- 低碳环保的活动方案范文(13篇)
- 2025年债务解决方案资产协议书
- 2025年企业电气设施维护合同
- 2025年家用空气调节器项目提案报告模稿
- 2025年电子脂肪秤项目立项申请报告模范
- 2025年芝士片项目立项申请报告模范
- 2025年空心桨叶干燥机项目立项申请报告模板
- 2025年临时性杂工劳动合同
- 2024年临沂市高三一模(学业水平等级考试模拟试题)物理试卷
- 广州猎德大桥三维曲面塔清水混凝土施工技术
- 产品设计思维 课件 第5章 产品设计的形式思维
- 我国糖尿病视网膜病变临床诊疗指南2022解读
- Python数据挖掘实战全套教学课件
- 高级茶艺师技能鉴定(协会版)备考题库-下(多选、判断题汇总)
- 特种设备作业人员体检表(叉车)
- c30混凝土路面施工方案
- 加强师德师风建设学校师德师风警示教育讲座培训课件
- 猪饲料购销合同书
- 电商运营销售计划Excel模版
评论
0/150
提交评论