C面向对象程序设计谭浩强版.ppt

上传人:wj 文档编号:18713290 上传时间:2023-10-16 格式:PPT 页数:800 大小:5.22MB
下载 相关 举报
C面向对象程序设计谭浩强版.ppt_第1页
第1页 / 共800页
C面向对象程序设计谭浩强版.ppt_第2页
第2页 / 共800页
C面向对象程序设计谭浩强版.ppt_第3页
第3页 / 共800页
C面向对象程序设计谭浩强版.ppt_第4页
第4页 / 共800页
C面向对象程序设计谭浩强版.ppt_第5页
第5页 / 共800页
C面向对象程序设计谭浩强版.ppt_第6页
第6页 / 共800页
C面向对象程序设计谭浩强版.ppt_第7页
第7页 / 共800页
C面向对象程序设计谭浩强版.ppt_第8页
第8页 / 共800页
C面向对象程序设计谭浩强版.ppt_第9页
第9页 / 共800页
C面向对象程序设计谭浩强版.ppt_第10页
第10页 / 共800页
C面向对象程序设计谭浩强版.ppt_第11页
第11页 / 共800页
C面向对象程序设计谭浩强版.ppt_第12页
第12页 / 共800页
C面向对象程序设计谭浩强版.ppt_第13页
第13页 / 共800页
C面向对象程序设计谭浩强版.ppt_第14页
第14页 / 共800页
C面向对象程序设计谭浩强版.ppt_第15页
第15页 / 共800页
C面向对象程序设计谭浩强版.ppt_第16页
第16页 / 共800页
C面向对象程序设计谭浩强版.ppt_第17页
第17页 / 共800页
C面向对象程序设计谭浩强版.ppt_第18页
第18页 / 共800页
C面向对象程序设计谭浩强版.ppt_第19页
第19页 / 共800页
C面向对象程序设计谭浩强版.ppt_第20页
第20页 / 共800页
亲,该文档总共800页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

C面向对象程序设计谭浩强版.ppt

《C面向对象程序设计谭浩强版.ppt》由会员分享,可在线阅读,更多相关《C面向对象程序设计谭浩强版.ppt(800页珍藏版)》请在冰点文库上搜索。

C面向对象程序设计谭浩强版.ppt

C+面向对象程序设计,第一讲,第一章C+的初步知识第二章类和对象第三章关于类和对象的进一步讨论第四章运算符重载第五章继承与派生第六章多态性与虚函数第七章输入输出流,结束放映,第一章C+的初步知识,1.1从C到C+1.2C+语言的词法和词法规则1.3最简单的C+程序1.4C+对C的扩充1.5C+程序的编写和实现,1.1从C到C+,C语言是结构化和模块化的语言,C程序的设计者必须细致地设计程序中的每个细节,准确地考虑程序运行时每一时刻发生的事情,当程序规模变大时,结构化程序设计就显得力不从心。

为了解决软件设计危机,在20世纪80年代提出了面向对象的程序设计思想(OOP)在实践中人们发现C语言使用如此广泛,如果在它的基础上发展一种面向对象的语言,一定会让大众容易接收这种语言,所以产生了C+。

AT&T发布的第一个C+编译系统是一个预编译器,它把C+代码转换成C代码,然后再用C编译系统生成目标代码。

1988产生第一个C+编译系统1989C+2.0类的多重继承1991C+3.0类的模板C+4.0异常处理、命名空间1997ANSI发布C+标准,C+既可以用于面向过程的结构化程序设计,也可用于面向对象的程序设计。

C+对C的增强体现在两个方面:

1.对原来的面向过程机制做了扩充。

2.增加了面向对象的机制。

学习C+之后,既可以进行面向对象的程序设计,也可以进行面向过程的程序设计。

1.2C+语言的词法和词法规则,C+语言的字符集等同于C语言的字符集,包括:

(1)大小写英文字母

(2)数字字符(3)其他ASCII码字符(除、$外)。

单词及词法规则单词是构成语句的关键成份之一,通常由若干字符组成,C+有几种单词:

1.关键字2.标识符3.运算符4.分隔符5.注释符。

关键字是C+语言中的命令字,它是预定义好的单词,C+编译程序对其有专门的解释。

int、float、if、else、while、switch等等。

标识符程序员用标识符对程序中元素实施命名,包括函数名、类名、对象名、类型名、变量名、常变量名、数组名等。

标识符以字母或下划线开始,后跟字母、数字、下划线,标识符区分大小写字母。

运算符运算符代表某种操作的单词,由一个或多个字符组成。

注意运算符的优先级和结合顺序。

参考本书附录B(P287)。

分隔符在语句中关键字和标识符之间、各个语句之间要用分隔符分开。

C+常用的分隔符有空格、逗号、分号、冒号、大括号。

注释符C+提供了两种注释符。

/*注释*/注释,1.3最简单的C+程序,例1.1输出一行字符“ThisisaC+program.”。

#include/用cout输出时需要用/此头文件usingnamespacestd;/使用命名空间stdintmain()coutThisisaC+program.n;/上面用C+的方法输出一行return0;,

(1)标准C+规定main函数必须声明为int类型,如果程序正常运行,向操作系统返回一个零值,否则返回非零值,通常是-1。

(2)C+程序中可以用/*/做注释,可以用/做注释。

前者可以做多行注释,后者只做单行注释。

(3)C+程序中常用cout、cin进行输出输入,cout是C+定义的输出流对象,是插入运算符。

(4)使用cout、cin需要用头文件iostream,在程序开始要用#include声明包含的头文件。

(5)usingnamespacestd;意思是使用命名空间。

C+标准库中的类和函数是在命名空间std中声明的,因此程序中如用C+标准库中的有关内容(此时需要用#include命令行),就要用usingnamespacestd;语句声明。

例1.2求a和b两个数之和/求两数之和#include/预处理命令usingnamespacestd;/使用命名空间stdintmain()/主函数首部/函数体开始inta,b,sum;/定义变量cinab;/输入语句sum=a+b;/赋值语句couta+b=sumendl;/输出语句return0;/如程序正常结束,返回一个零值,cin是C+定义的输入流对象。

”是提取运算符,与cin配合,其作用是从输入设备中提取数据送到输入流cin中。

在程序执行时,键盘输入的第一个数据赋予a,第二个数据赋予b。

cout语句中的endl是C+控制符常数,作用是让光标换行。

如果在本程序运行时输入:

123456程序则输出:

a+b=579,例1.3求两个数中的大数#includeusingnamespacestd;intmain()intmax(intx,inty);/对max函数作声明inta,b,c;cinab;c=max(a,b);/调用max函数coutmax=cendl;return0;,intmax(intx,inty)/定义max函数intz;if(xy)z=x;elsez=y;return(z);,本程序包含两个函数,主函数main和被调用的函数max。

max函数的作用是将两个整数中的大数赋予变量z。

return语句将z的值返回给主函数main。

返回值是通过函数名max带回到main函数的调用处。

程序运行情况如下:

1825(输入18和25)max=25(输出最大值25),第二讲,例1.4包含类的C+程序#includeusingnamespacestd;classStudent/声明一个类,类名为Studentprivate:

/以下为类中的私有部分intnum;/私有变量numintscore;/私有变量scorepublic:

/以下为类中公用部分voidsetdata()/定义公用函数setdatacinnum;/输入num的值cinscore;/输入score的值voiddisplay()/定义公用函数displaycoutnum=numendl;/输出num的值coutscore=scoreendl;/输出score的值;/类的声明结束,Studentstud1,stud2;/定义stud1和stud2为Student类的变量,称为对象intmain()/主函数首部stud1.setdata();/调用对象stud1的setdata函数stud2.setdata();/调用对象stud2的setdata函数stud1.display();/调用对象stud1的display函数stud2.display();/调用对象stud1的display函数return0;,程序中声明一个被称为类的类型Student。

声明时要用关键字class。

C+类中可以包含两种成员即数据(如变量num、score)和函数(如setdata函数和display函数)。

分别称为数据成员和成员函数。

在C+中将一组数据和访问这组数据的函数封装在一起,组成类。

一个类是由一组数据,一组对其访问的若干函数,以及数据和函数的访问属性组成的。

在前面程序中看到的private(私有)public(公有)保留字代表数据和函数的访问属性。

凡是指定为公有的数据和函数,既可由本类的函数访问和调用,也可由其他函数或语句访问和调用;凡是指定为私有的数据和函数,通常只能由本类的函数访问和调用。

程序中“Studentstud1,stud2;”是一个定义语句,定义两个Student类型变量stud1和stud2,Student类与int一样是C+的合法类型。

具有类类型的变量称为对象。

Student的对象stud1,stud2具有同样的结构和特征。

在类外调用成员函数时必须在函数名前冠以类的名称。

主函数中第一条语句输入学生1的学号和成绩,第二条语句输入学生2的学号和成绩,第三条语句输出学生1的学号和成绩,第四条语句输出学生2的学号和成绩。

程序运行情况如下:

100198.5100276.5num=1001Score=98.5num=1002Score=76.5,为了与C兼容,C+保留了C语言中的一些规定,例如头文件的文件名,以C语言里头文件的扩展名是.h,许多C+编译系统保留了这种扩展名,近年推出的C+编译系统新版本,推出了一批不带扩展名的头文件如iostream,string,cmath等。

为了兼容C+仍允许使用带扩展名的头文件。

由于C语言无命名空间,因此使用带扩展名的头文件时不用usingnamespacestd。

1.3C+对C的扩充,C+既可用于面向过程的程序设计,也可用于面向对象程序设计。

C+继承了C语言提供的绝大部分功能和语法规定,并在此基础上作了扩充。

1.4.1C+的输入和输出1.4.2用const定义常变量1.4.3函数原型声明1.4.4函数的重载1.4.5函数模板1.4.6有默认参数的函数,1.4.7变量的引用1.4.8内置函数1.4.9作用域运算符1.4.10字符串变量1.4.11动态分配/回收内存运算符,1.3.1C+的输入输出,C+为了方便使用,除了可以利用printf和scanf函数进行输入和输出外,还增加了标准输入流输出流cin和cout。

它们是在头文件iostream中定义的,标准流是不需要打开文件和关闭文件就能直接操作的流式文件,在此标准输入流是指从键盘上输入的数据,标准输出流是指向屏幕输出的数据流。

C+预定义的标准流如表1.2所示。

1.用cout进行输出,格式:

cout表达式1表达式2功能:

由左向右逐个计算表达式的值,将其插入到输出流cout中。

cout必须与输出运算符一起使用,每个后跟一个表达式,运算符的结合方向是从左向右,所以各个表达式的值按从左到右的顺序插入到输出流中。

For(k=1;k=3;k+)cout“k=“kendlendl是C+输出流的常数,在头文件iostream中定义,代表让光标换行。

在C+中也可以用”n”控制光标换行。

所以输出语句也可写成:

cout“k=“k“n”,2.用cin进行输入,格式:

cin变量1变量2是C+的提取运算符,表示从标准输入设备取得数据,赋予其后的变量。

从键盘输入数值数据时,两个数据之间用空格分隔或用回车分隔。

inta;floatbcinab;从键盘输入2032.45,例1.5cin和cout的使用,#includeusingnamespacestd;intmain()coutname;cinage;coutyournameisnameendl;coutyourageisageendl;return0;,1.3.2用const定义常变量,格式:

const类型变量名=常数例:

constfloatPI=3.14159;,1.3.3函数原型声明,C+规定,如果函数调用在函数定义之前,要求在调用之前声明该函数的原型。

格式:

函数类型函数名(形参表);形参表中形参可以只写类型。

例:

intmax(intx,inty);或intmax(int,int);其实C+编译时,只检查参数的数据类型。

1.3.4函数的重载,C+允许在同一个域中用一个函数名定义多个函数,这些函数的参数个数、参数类型不相同。

用一个函数名实现不同的功能,就是函数的重载。

例1.6设计程序计算三个数中的大数,#includeusingnamespacestd;intmax(inta,intb,intc)/求3个整数中的最大者if(ba)a=b;if(ca)a=c;returna;floatmax(floata,floatb,floatc)/求3个实数中的最大者if(ba)a=b;if(ca)a=c;returna;longmax(longa,longb,longc)/求3个长整数中的最大者if(ba)a=b;if(ca)a=c;returna;,intmain()inta,b,c;floatd,e,f;longg,h,i;cinabc;cindef;cinghi;intm;m=max(a,b,c);/函数值为整型coutmax_i=mendl;floatn;n=max(d,e,f);/函数值为实型coutmax_f=nendl;longintp;p=max(g,h,i);/函数值为长整型coutmax_l=pendl;return0;,例1.7,下面的例子说明用函数重载设计参数个数不同的函数,用一个函数名求两个整数或三个整数中的最大数。

#includeusingnamespacestd;intmax(inta,intb,intc)/求3个整数中的最大者if(ba)a=b;if(ca)a=c;returna;,intmax(inta,intb)/求两个整数中的最大者if(ab)returna;elsereturnb;intmain()inta=7,b=-4,c=9;coutmax(a,b,c)endl;/输出3个整数中的最大者coutmax(a,b)endl;/输出两个整数中的最大者return0;,注意:

不允许函数参数个数、参数类型都相同,只是函数返回值不同。

因为系统无法从调用形式上判断调用与哪个函数相匹配。

1.3.5函数模板,如果两个函数的参数个数相同,函数的行为相同(做同样的事),只是函数和参数的数据类型不同,如果用函数重载的话,编写的函数代码是相同的,为了节省时间,C+提供了函数模板功能。

格式:

templatetypename标识符,typename标识符,函数定义(函数的类型和参数的类型用声明的标识符表示),template是关键字,含义是模板typename是关键字,表示其后的标识符代表类型参数,调用时根据实参的类型确定形参的类型。

所谓函数模板,是建立一个通用函数,不指定函数类型和参数类型,而用一个虚拟的类型表示。

在调用函数时,用实参的类型取代模板中的虚拟类型。

例1.8为计算两个数中的大数定义函数模板,#includeusingnamespacestd;templateTmax(Ta,Tb,Tc)/用虚拟类型T表示类型if(ba)a=b;if(ca)a=c;returna;,intmain()inti1=8,i2=5,i3=6,i;doubled1=56.9,d2=90.765,d3=43.1,d;longg1=67843,g2=-456,g3=78123,g;i=max(i1,i2,i3);d=max(d1,d2,d3);g=max(g1,g2,g3);couti_max=iendl;coutd_max=dendl;coutg_max=gendl;return0;,从程序中看到,此问题用函数模板比用函数重载更方便。

注意,函数模板只适用于函数参数的个数相同而类型不同,并且函数体相同的情况,如果函数的参数个数不同,则不能用函数模板。

1.4.6有默认参数的函数,C+允许为函数的参数设置默认值,这时调用函数时,如果没有实参,就以默认值作为实参值。

格式:

形参类型形参变量名=常数功能:

调用函数时,如果没有实参,就以常数作为该形参的值;如果有实参,仍以实参的值作为该形参的值。

注意:

有默认值的形参必须放在形参表的右边,不允许无默认参数值和有默认参数值的形参交错排列。

例:

编写计算圆柱体体积函数floatvolume(floath,floatr=12.5)调用可以采用以下任何一种形式:

volume(45.6);volume(32.5,10.5);函数参数结合从左到右,用第一种方式调用时,只有一个实参,圆半径的值取默认值12.5,用第二种方式调用时,有两个实参,圆半径的值取实参的值10.5。

注意:

一、如果用函数原型声明,只要在函数原型声明中定义形参的默认值即可。

二、一个函数名不能同时用于重载函数和带默认形参值的函数。

当调用函数时,如少写一个参数,系统无法判断是利用重载函数还是利用带默认参数值的函数,出现二义性。

例如将例1.7中的第三行改为intmax(inta,intb,intc=100);此时max是重载函数,又带默认参数值,如果出现max(5,23)形式的调用,编译系统无法断定调用哪个函数,于是发出编译出错的信息。

1.4.7变量的引用,C+提供了为变量取别名的功能,这就是变量的引用。

格式:

类型&变量1=变量2变量2是在此之前已经定义过的变量,且与变量1的类型相同。

这里为变量2定义一个别名变量1,在程序里变量1和变量2就是同一个变量。

注意:

两个变量不能用同一个别名。

例:

inta=3,b=4;int变量a有两个别名b和c。

#includeusingnamespacestd;intmain()inta=10;int,图1.1,程序运行结果如下:

1002020,将引用作为函数参数,C+除了可以用普通变量、指针变量做形参外,还可以用引用变量做形参。

(1)用普通变量做形参这时传递的是实参的值,在函数内形参与实参是两个不同的内存单元,对形参的修改不会影响实参的值。

例1.10无法实现两个变量的值互换的程序,#includeusingnamespacestd;voidswap(inta,intb)inttemp;temp=a;a=b;b=temp;/实现a和b的值互换,intmain()inti=3,j=5;swap(i,j);couti,jendl;/i和j的值未互换return0;,图1.2,

(2)用指针变量做形参C语言还允许用指针变量做形参,这时传递的是实参变量的地址(指针),在函数内利用这个指针访问实参变量。

例1.11用指针变量做形参,实现两个变量值的交换。

#includeusingnamespacestd;voidswap(int*p1,int*p2)inttemp;temp=*p1;*p1=*p2;*p2=temp;,intmain()inti=3,j=5;swap(,图1.3,(3)用引用变量做形参用指针变量做形参,它将实参变量的地址传递给形参,在函数内用“*指针变量”的方式访问实参变量。

我们知道引用变量是变量的别名,在调用函数时,用引用变量做的形参就成了实参变量的别名,在函数中用的形参名就是实参的别名,这样比用指针变量更直观、更方便。

例1.12利用引用变量实现两个变量值的交换#includeusingnamespacestd;voidswap(int,intmain()inti=3,j=5;swap(i,j);couti=ij=jendl;return0;,图1.4,对引用的进一步说明,

(1)引用变量都具有非void类型

(2)不能建立引用的数组(3)可以建立常引用变量,不允许修改常引用变量的值例:

inti;constint/i不是常变量,可以修改,(4)可以建立指针变量的引用变量例:

inti;int*p=/pt是p的别名变量,同时/也是指针变量,1.4.8内置函数,C+提供了一种机制,在编译时,将所调用的函数的代码嵌入到调用函数代码中,在执行函数时省去了调用环节,提高了函数的执行速度。

这种机制称为内置函数,有的书称内联函数。

格式:

inline函数类型函数名(形参表)函数体inline是C+的关键字,在编译时,编译程序会把这个函数嵌入到调用函数的函数体中调用格式:

函数名(实参表),例1.13计算三个整数中的大数#includeusingnamespacestd;inlineintmax(inta,intb,intc)/这是一个内置函数,/求3个整数中的最大者if(ba)a=b;if(ca)a=c;returna;intmain()inti=7,j=10,k=25,m;m=max(i,j,k);coutmax=mendl;return0;,由于在定义函数时指定它是内置函数,因此编译系统在遇到函数调用max(i,j,k)时就用max函数体的代码代替max(i,j,k),同时用实参代替形参。

调用语句m=max(i,j,k)就被置换成:

a=i;b=j;c=k;if(ba)a=b;if(ca)a=c;m=a;,例1.15用内置函数计算平方根#includeusingnamespacestd;inlineintpower(intx)/定义内置函数returnx*x;intmain()coutpower

(2)endl;coutpower(1+1)endl;return0;,编译程序遇见内置函数power时,先求出函数的实参值(1+1=2),然后用power函数体代替函数调用,调用语句变成:

cout2*2endl;cout2*2endl;运行结果是44,使用内置函数可以节省程序的运行时间,但增加了目标程序的长度。

所以在使用时要衡量时间和空间的得失。

1.4.9作用域运算符,并不是所有的变量在程序运行的时时刻刻都是可见的。

有的变量在整个程序运行期间都是可见的,称它们为全局变量;有的变量只能在一个函数中可知,被称为局部变量。

每个变量都有其有效的作用域,程序只能在变量的有效的作用域内使用变量,不能直接使用其他域中的变量。

程序的内存区域,程序的内存空间,代码区,全局数据区,堆区,栈区,程序中各个函数的代码,程序中全局数据和静态数据,程序中的动态数据,程序中各函数内的数据,例1.16局部变量和全局变量同名#includeusingnamespacestd;floata=13.5;intmain()inta=5;coutaendl;return0;,程序中有两个变量a,一个是全局变量,另一个是main函数的局部变量,根据局部变量会屏蔽同名的全局变量规则,在函数中出现的变量a是局部变量,因此输出的值是5,而不是13.5,为了在函数中访问全局变量C+提供了作用域运算符:

,可以用来指定要访问的作用域,可以把main函数改写成,#includeusingnamespacestd;floata=13.5;intmain()inta=5;coutaendl;cout:

aendl;return0;:

a表示全局变量a。

注意不能用:

访问局部变量。

1.4.10字符串变量,C+提供了字符串类类型string,实际上它不是C+的基本类型,它是在C+标准库中声明的一个字符串类,程序可以用它定义对象。

1.定义字符串变量格式:

string变量名表;可以在定义变量时用字符串常量为变量赋初值:

string变量名=字符串常量注意:

如用字符串变量,在程序开始要用包含语句把C+标准库的string头文件包含进来。

2.对字符串操作对字符串变量赋值字符串变量=字符串表达式例:

stringst1,st2;st1=“王点点“;st2=st1;,访问字符串中的字符C+允许把字符串作为字符数组,第一个字符的下标是0,第二个字符的下标是1,以此类推。

例:

stringw=“then”;w2=a;结果字符串w变成than,输入输出字符串格式:

cin字符串变量cout字符串变量,字符串连接运算格式:

字符串1+字符串2功能:

把连接运算符两端的字符连接成一个字符串。

表达式中可以用字符串常量也可以用字符串变量。

例:

stringst1=“C+”;stringst2=“Language”;st1=st1+st2;结果是C+Language,字符串的比较运算可以用关系运算符、=、=、!

=、“chinese”运算结果是假。

1.4.11动态分配/撤销内存的运算符new和delete,分配内存运算new类型(初值)类型是决定分配空间尺寸的关键元素,如果运算结果正确,它的值是分配内存空间的起始地址,否则返回NULL。

例:

int*a=newint;int*b=newint(100);char*ch=newchar10;int*q=newint54;float*p=newfloat(3.14159);,归还动态内存运算delete

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

当前位置:首页 > 法律文书 > 起诉状

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2