第2章-从C语言向C++过渡.ppt

上传人:s****8 文档编号:69240364 上传时间:2022-12-31 格式:PPT 页数:31 大小:329KB
返回 下载 相关 举报
第2章-从C语言向C++过渡.ppt_第1页
第1页 / 共31页
第2章-从C语言向C++过渡.ppt_第2页
第2页 / 共31页
点击查看更多>>
资源描述

《第2章-从C语言向C++过渡.ppt》由会员分享,可在线阅读,更多相关《第2章-从C语言向C++过渡.ppt(31页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、 第二章第二章 从从C语言向语言向C+过渡过渡主讲:宋丽红主讲:宋丽红面向对象程序设计(面向对象程序设计(面向对象程序设计(面向对象程序设计(C+C+)Oriented Object Programming Oriented Object Programming(C+)(C+)2第二章第二章 从从C语言向语言向C+过渡过渡n2-1 C+2-1 C+语言的发展过程语言的发展过程n2-2 2-2 在较小范围内如何将在较小范围内如何将C+C+增强增强C Cn2-3 2-3 在较大范围内如何将在较大范围内如何将C+C+增强增强C C32-1 C+语言的发展过程语言的发展过程n C+C+语言基于语言基于

2、C C,是,是C C的一个超集集合。的一个超集集合。n C+C+继承了继承了C C的全部优点,而且还支持面向对的全部优点,而且还支持面向对象特征。象特征。n C+C+由由BCPLBCPL和和Simula67Simula67的某些灵感而导致产生的某些灵感而导致产生的。的。n 19801980年,年,C+C+由贝尔实验室的由贝尔实验室的BjarneBjarne StroustrupStroustrup创建,被称为带类的创建,被称为带类的C C。n 19941994年,建立年,建立ANSI C+ANSI C+标准。标准。42-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 一、一、I/OI

3、/O流控制流控制n 二、内联函数二、内联函数n 三、函数重载三、函数重载n 四、默认参数的函数四、默认参数的函数n 五、五、newnew和和deletedeleten 六、六、constconst说明符说明符n 七、引用七、引用n 八、程序结构八、程序结构n 九、其他九、其他52-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 2.2.12.2.1 I/O I/O流控制流控制C+C+中输入中输入/输出流(一般叫输出流(一般叫iostreamsiostreams或或streamsstreams)提供了提供了C C的的stdio.hstdio.h库中的所有功能。库中的所有功能。输入输入/

4、输出流用作将具有类型的对象转换成可读的正文,反之亦输出流用作将具有类型的对象转换成可读的正文,反之亦然。流能读写二进制数据。然。流能读写二进制数据。C+C+程序以四个预定义的流开始,它们是:程序以四个预定义的流开始,它们是:cincin标准输入、标准输入、coutcout标标准输出、准输出、cerrcerr标准错、标准错、clogclog缓冲的缓冲的cerrcerr。n 标准输入输出流标准输入输出流 p23 p23 在在iostream.hiostream.h中说明中说明ncoutcout输入流接收变量输入流接收变量ncoutcout“Hello,world!n”a;a;ncoutcout“姓

5、名:?姓名:?”“afc;afc;62-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn2.2.12.2.1 I/O I/O流控制流控制n2 2、使用控制符使用控制符#include#include n注意注意n1 1、输入流能自动跳过空白字符、输入流能自动跳过空白字符n2 2、字符串输入避免溢出,可采取以下方法:、字符串输入避免溢出,可采取以下方法:char arraySIZE;char arraySIZE;cin.width(sizeof(arraycin.width(sizeof(array););cincinarray;array;72-2 在较小范围内如何将在较小范围内如何将

6、C+增强增强Cn 2.2.22.2.2 内联函数内联函数使用关键字使用关键字inlineinline说明的函数是内联函数。作用相当于带参数的宏。说明的函数是内联函数。作用相当于带参数的宏。n 使用内联函数的必要性使用内联函数的必要性内联函数增加了代码空间,但减少了执行时间(函数调用开销)内联函数增加了代码空间,但减少了执行时间(函数调用开销)#include#include void main()void main()char c;char c;intint isnumber(charisnumber(char););coutcout”Enter a character:”;c;c;if(is

7、number(cif(isnumber(c)coutcout”You entered a digit.”You entered a digit.”else else coutcout”You entered a non-digit.”=0&c=0&c=0&c=0&c=9)?1:0)表达式替换的方法。但是,手工替表达式替换的方法。但是,手工替换很烦琐,最好让编译程序去做。换很烦琐,最好让编译程序去做。n 内联函数是程序行的扩展,主要是解决程序的运行效率。内联函数是程序行的扩展,主要是解决程序的运行效率。82-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 内联函数的使用(内联函数的使用

8、(1 1)n在函数声明和定义的最前面加关键字在函数声明和定义的最前面加关键字inlineinline在在函数声明函数声明时必须有时必须有inlineinline,定义时可有可无。定义时可有可无。#include#include void main()void main()char c;char c;inlineinline intint isnumber(charisnumber(char););inline inline intint isnumber(charisnumber(char c)c)/或用或用intint isnumber(charisnumber(char c)c)retur

9、n(c=0&c=0&c=9)?1:0;92-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 内联函数的使用(内联函数的使用(2 2)n 内联函数必须在调用之前声明或定义。因为内联内联函数必须在调用之前声明或定义。因为内联函数的代码必须在被替换之前已经生成被替换的代函数的代码必须在被替换之前已经生成被替换的代码。码。#include#include inline inline intint isnumber(charisnumber(char c)c)return(c=0&c=0&c=9)?1:0;void main()void main()char c;char c;/inline

10、/inline intint isnumber(charisnumber(char););102-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn内联函数的函数体限制内联函数的函数体限制n内联函数中不能含有复杂的结构控制语句,否则,内联函数中不能含有复杂的结构控制语句,否则,编译时将该函数视同普通函数那样产生函数调用编译时将该函数视同普通函数那样产生函数调用代码。代码。n递归函数是不能被用来做内联函数的。递归函数是不能被用来做内联函数的。n内联函数只适合于只有内联函数只适合于只有1 15 5行的小函数,而且不行的小函数,而且不能频繁地被调用。能频繁地被调用。112-2 在较小范围内如何

11、将在较小范围内如何将C+增强增强Cn 2.2.32.2.3 函数重载函数重载n 使用重载函数的必要性使用重载函数的必要性n 在不同类型上作相同运算而又用相同名字的情在不同类型上作相同运算而又用相同名字的情况,称为重载。况,称为重载。int add(int x,int y)int add(int x,int y)int temp;temp=x+y;int temp;temp=x+y;return temp;return temp;double add(double x,double y)double add(double x,double y)double temp;temp=x+y;doubl

12、e temp;temp=x+y;return temp;return temp;main()main()int a=4,b=5;double x=12.5,y=75.75;int a=4,b=5;double x=12.5,y=75.75;coutadd(a,b)”t”add(x,y)endl;coutadd(a,b)”t”add(x,y)endl;运行结果为:运行结果为:9 988.2588.25122-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 使用重载函数的必要性使用重载函数的必要性n 使用不同数目的参数使用不同数目的参数#include#include intint mu

13、l(intmul(int x,intx,int y)y)intint temp;temp=x*y;temp;temp=x*y;return temp;return temp;intint mul(intmul(int x,intx,int y,inty,int z)z)intint temp;temp=x*y*z;temp;temp=x*y*z;return temp;return temp;main()main()intint a=5,b=10,c=20;a=5,b=10,c=20;coutcoutmul(a,bmul(a,b)”n”)”n”mul(a,b,cmul(a,b,c)a=5,b=

14、10,c=3fun(5,10);-a=5,b=10,c=3n 默认参数与函数重载默认参数与函数重载默认参数可以将一系列重载函数合成一个为函数,默认参数可以将一系列重载函数合成一个为函数,但由于必须从右至左定义,并向左匹配参数,因但由于必须从右至左定义,并向左匹配参数,因此它没有重载函数灵活,而且数据类型也有限制。此它没有重载函数灵活,而且数据类型也有限制。n 默认值的限定默认值的限定n 默认值可为全局变量、全局常量和函数,即不默认值可为全局变量、全局常量和函数,即不能是局部变量。能是局部变量。162-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 2.2.52.2.5 new new

15、和和deletedeleten 堆内存堆内存动态内存(在运行时申请内动态内存(在运行时申请内存)。存)。用户内存用户内存:代码区、全局数据区、栈区、堆代码区、全局数据区、栈区、堆n newnew和和deletedelete的格式的格式n 创建、销毁一变量:创建、销毁一变量:new new 数据类型数据类型(初始值初始值);delete);delete 指针名;指针名;intint*p;p=new *p;p=new intint;delete p;delete p;n 创建、销毁一数组:创建、销毁一数组:new new 数据类型数据类型 长度长度;deletedelete指针名;指针名;inti

16、nt*p;p=new int30;delete p;*p;p=new int30;delete p;172-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 说说 明明n newnew类似于函数类似于函数mallocmalloc()(),分配堆内存,但比分配堆内存,但比mallocmalloc()()更简练。更简练。n newnew的操作数为数据类型,它可以带初始化值表或单的操作数为数据类型,它可以带初始化值表或单元个数。元个数。newnew返回一个具有操作数的数据类型的指针。返回一个具有操作数的数据类型的指针。n newnew和和deletedelete是是C+C+专有的操作符,它们

17、不用头文件声专有的操作符,它们不用头文件声明。明。n deletedelete类似于类似于free()free(),释放堆内存。释放堆内存。deletedelete的操作数的操作数是是newnew返回的指针,当返回的是返回的指针,当返回的是newnew分配的数组时,应该分配的数组时,应该带带。deletedata;deletedata;n 由于堆对象的生存期是从创建对象到销毁或程序结束,由于堆对象的生存期是从创建对象到销毁或程序结束,因此,删除不再需要的堆对象是一个必须进行的工作。因此,删除不再需要的堆对象是一个必须进行的工作。182-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn

18、2.2.62.2.6 const const说明符说明符在说明中根据不同情况,在说明中根据不同情况,constconst的位置略有不同。的位置略有不同。const const intint i=5;i=10;i=5;i=10;n 常量定义常量定义n 功能和功能和C C中的符号常量定义类似,比符号常量更好中的符号常量定义类似,比符号常量更好的是用的是用constconst定义的常量具有数据类型。定义的常量具有数据类型。constconst说明说明的数据是真正的数据的数据是真正的数据被登记在符号表中,具有被登记在符号表中,具有名字、类型和值。名字、类型和值。n 常量定义时必须初始化,初始化值是常量

19、或常量常量定义时必须初始化,初始化值是常量或常量表达式。表达式。const float pi=3.14;const float pi=3.14;n 常量同样有全局和局部之分。常量可以定义在头常量同样有全局和局部之分。常量可以定义在头文件中。文件中。192-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 指向常量的指针指向常量的指针n const const 数据类型数据类型*指针名;指针名;指针类型前加指针类型前加constconst,const const intint*p;*p;p p是指针,是指向整型常量的指针,意味是指针,是指向整型常量的指针,意味着着*p p不能改变,但是不

20、能改变,但是p p可以改变。可以改变。即即 p=#;p=#;*p=#;*p=#;0067:f600100067:fd660067:fd66变量变量p p常量常量i i,0067:f6000067:f600const const intint i=10,j=20;const i=10,j=20;const intint*p=&i;p=&j;*p=&i;p=&j;0067:f7000067:f70020常量常量j j 0067:f7000067:f700202-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn指针常量指针常量n数据类型数据类型*const const 指针名;指针名;指针名

21、前加指针名前加const,const,intint*const p;*const p;np p是常量,是指向整型数据的指针常量,意味着是常量,是指向整型数据的指针常量,意味着p p不能改变,但是不能改变,但是*p p可以改变。可以改变。n即即 p=#;p=#;*p=#;*p=#;n定义指针常量时定义指针常量时必须初始化必须初始化,初始化值是字符,初始化值是字符串常量的地址。串常量的地址。0067:f600100067:f6000067:f6000067:fd660067:fd66常量常量p p变量变量i iintint i=10;i=10;intint*const p=&i;*p=20;*co

22、nst p=&i;*p=20;2020212-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 指向常量的指针常量指向常量的指针常量n const const 数据类型数据类型*const const 指针名;指针名;指针类型和指针名前均加指针类型和指针名前均加constconstconst const intint*const p;*const p;p p是指针常量,是指向整型常量的指针常是指针常量,是指向整型常量的指针常量,意味着量,意味着p p不能改变,不能改变,*p p也不能改变。也不能改变。n 即即 p=#;p=#;*p=#;*p=#;0067:f600100067:f600

23、0067:f6000067:fd660067:fd66常量常量p p常量常量i iconst const intint i=10;const i=10;const intint*const p=&i;*const p=&i;222-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 用用constconst修饰形式参数修饰形式参数 n void void func(constfunc(const structstruct student*s)student*s)n 虽虽然然以以指指针针方方式式传传递递一一个个结结构构体体指指针针,但对源数据不能做修改。但对源数据不能做修改。n 用用con

24、stconst修饰成员函数修饰成员函数 n 表表示示该该成成员员函函数数不不可可以以改改变变对对象象属属性性值。值。n intint getAgegetAge()const;()const;232-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 作业:作业:nP32 2.6(3)P32 2.6(3)nP99 5.8P99 5.8nP184 8.9P184 8.9242-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 2.2.7 2.2.7 引用引用n 引用的概念引用的概念 T&T&n 引用就是给另一个变量或对象起一个引用就是给另一个变量或对象起一个别名别名。引用。引用永远永

25、远维系维系在一个目标上。对引用的改变就是对引用变量的改在一个目标上。对引用的改变就是对引用变量的改变。变。n 引用不是值,不占内存。引用不是值,不占内存。n 对引用取地址,返回的是引用目标变量的地址。对引用取地址,返回的是引用目标变量的地址。P185P185n 引用在声明时引用在声明时必须必须初始化初始化 数据类型数据类型&引用名引用名=初始值;初始值;intint i;i;intint&j=i;&j=i;n 初始化目标类型必须与引用的数据类型初始化目标类型必须与引用的数据类型一致一致或可以或可以转转化成化成引用引用的数据类型。的数据类型。P188P188n 不能建立引用数组,也不能引用不能建

26、立引用数组,也不能引用voidvoid型指针。型指针。n 没有引用的引用,也没有引用的指针没有引用的引用,也没有引用的指针252-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 用引用传递函数参数用引用传递函数参数n 用引用可以实现用引用可以实现C C中地址传送的功能,而且比地中地址传送的功能,而且比地址(指针)传递更简单和易于理解。址(指针)传递更简单和易于理解。n 注意重载函数注意重载函数。P191P191n 引用与指针一样,可以返回多个值。引用与指针一样,可以返回多个值。P192P192main()main()intint a=5,b=10;a=5,b=10;void void

27、 swap(swap(intint&,&,intint&););swap(swap(a,ba,b););printf(“aprintf(“a=%d,b=%dn”,a,b)=%d,b=%dn”,a,b);void void swap(intswap(int&x,intx,int&y)y)intint t;t;t=x;x=y;y=t;t=x;x=y;y=t;main(main()swap(swap()5 5a:a:1010b:b:t:t:5 510105 5x:a:x:a:y:b:y:b:a:a:b:b:262-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 函数返回值是引用函数返回值是

28、引用n 函数返回值是引用将不产生返回值的副本,但函数返回值是引用将不产生返回值的副本,但是,不能返回一个不在作用域范围内的变量或对是,不能返回一个不在作用域范围内的变量或对象的引用。象的引用。n 函数返回值是引用可以使函数成为左值。函数返回值是引用可以使函数成为左值。float&float&fun(intfun(int index,float a)index,float a)float&r=aindex;float&r=aindex;return r;return r;float test=3.5,5.4,5.5;float test=3.5,5.4,5.5;fun(1,test)=4.5;t

29、est1=4.5fun(1,test)=4.5;test1=4.5与指针一样,当函数返回引用时,注意避免产生与指针一样,当函数返回引用时,注意避免产生悬挂引用悬挂引用。272-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 用用constconst限定引用限定引用n 当函数需传递的实参是很大的数据类型时当函数需传递的实参是很大的数据类型时(数组、结构体),参数传递采用指针或引用。(数组、结构体),参数传递采用指针或引用。但是,采用指针和引用就存在修改实参的风险。但是,采用指针和引用就存在修改实参的风险。因此,用因此,用constconst来限定引用作为函数的形参。来限定引用作为函数的

30、形参。n 不允许对引用进行赋值。不允许对引用进行赋值。引用总是引用总是constconst的,所以不需要的,所以不需要const double const double const&a=1;const&a=1;只需只需const double&a=1;const double&a=1;n 堆中变量的堆中变量的引用引用n 用堆空间初始化引用,既可以用指针释放,用堆空间初始化引用,既可以用指针释放,也可以用引用释放堆空间。也可以用引用释放堆空间。作业:作业:P202 9.1(1)、)、9.2、9.3282-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 2.2.82.2.8 程序结构程序

31、结构n 程序程序=(算法(算法+数据结构)数据结构)算法与数据结构是一个整体算法与数据结构是一个整体封装和信息隐藏是面向对象的基本要素。算法总是离不开封装和信息隐藏是面向对象的基本要素。算法总是离不开数据结构,算法含有对数据结构的访问,算法只能适用于数据结构,算法含有对数据结构的访问,算法只能适用于特定数据结构。特定数据结构。n 程序程序=(算法)(算法)+(数据结构)(数据结构)数据结构与算法分离。数据结构与算法分离。软件系统的规模越来越大,复杂性不断增长,以致不得不软件系统的规模越来越大,复杂性不断增长,以致不得不对对“关键数据结构关键数据结构”重新评价。重新评价。数据结构的主要欠缺是应用

32、范围和可见性。许多重要的过数据结构的主要欠缺是应用范围和可见性。许多重要的过程和函数(子程序)的实现严格依赖与关键数据结构,如程和函数(子程序)的实现严格依赖与关键数据结构,如果这些关键数据结构的一个或几个数据有所改变,则涉及果这些关键数据结构的一个或几个数据有所改变,则涉及到整个软件系统。到整个软件系统。292-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 2.2.92.2.9 其他其他(1)(1)n 注释行注释行 /比比 /*/*/更容易,没有必要记更容易,没有必要记住注释结尾住注释结尾n 在块(分程序)内说明在块(分程序)内说明 允许在使用时才说明允许在使用时才说明变量变量n

33、 作用域限定运算符作用域限定运算符 :表示全局变量表示全局变量 intint i=10;i=10;main()main()intint i=5;i=5;:i+=10;:i+=10;coutcout”i=”i”i=”iendlendl;i=20 i=20302-2 在较小范围内如何将在较小范围内如何将C+增强增强Cn 2.2.92.2.9 其他(其他(2 2)n voidvoid类型类型 void*pr;float void*pr;float fprfpr;pr=pr=fprfpr;fptrfptr=(float)pr;=(float)pr;n 函数原型函数原型n 无名共用体无名共用体 直接用名

34、字存取直接用名字存取 void main()void main()union union intint i;float f;i;float f;f=3.0;f=3.0;n 显式类型转换显式类型转换 可以转换为用户定义类型可以转换为用户定义类型312-3 在较大范围内如何将在较大范围内如何将C+增强增强Cn 一、一、类的构造和数据封装类的构造和数据封装n 二、二、私有、保护和公共部分私有、保护和公共部分n 三、三、构造函数和析构函数构造函数和析构函数n 四、四、类属性与友元类属性与友元n 五、五、类中运算符和函数名重载类中运算符和函数名重载n 六、六、导出类导出类n 七、七、虚拟函数虚拟函数n 八、八、流库流库n 九、九、类模板类模板

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

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com