文库网
ImageVerifierCode 换一换
首页 文库网 > 资源分类 > PPTX文档下载
分享到微信 分享到微博 分享到QQ空间

《面向对象程序设计》课件第2章 C++对C的扩充.pptx

  • 资源ID:19622088       资源大小:371.54KB        全文页数:42页
  • 资源格式: PPTX        下载积分:10文币
微信登录下载
快捷下载 游客一键下载
账号登录下载
三方登录下载: QQ登录 微博登录
二维码
扫码关注公众号登录
下载资源需要10文币
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
如填写123,账号就是123,密码也是123。
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 
账号:
密码:
验证码:   换一换
  忘记密码?
    
友情提示
2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

《面向对象程序设计》课件第2章 C++对C的扩充.pptx

1、 第第第第2 2章章章章 C+C+对对对对C C的扩充的扩充的扩充的扩充2.42.4 命名空间命名空间 2.82.8 动态内存的分配动态内存的分配2.102.10 引用引用2.112.11 const 修饰符修饰符2.132.13 C+中函数的新特性中函数的新特性2.4 2.4 命名空间命名空间 2.4.1 2.4.1 为什么要引入为什么要引入命名空间命名空间 命名空间是随标准命名空间是随标准C+而引入的,用来防止全而引入的,用来防止全局空间内的命名冲突,即重名问题。局空间内的命名冲突,即重名问题。大型应用系统常常由许多人来设计完成,命名大型应用系统常常由许多人来设计完成,命名冲突是一种潜在的

2、危险,程序员必须细心地定义标冲突是一种潜在的危险,程序员必须细心地定义标识符,以保证名字的惟一性。识符,以保证名字的惟一性。一个标识符可在多个命名空间中定义,它在不同命一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。符发生冲突,因为已有的定义都处于其它命名空间中。例如,设例如,设Bill是是X公司的员工,工号为公司的员工,工号为123,而,而John是是Y公司的

3、员工,工号也是公司的员工,工号也是123。由于两人在不同。由于两人在不同的公司工作,可以使用相同的工号来标识而不会造成混的公司工作,可以使用相同的工号来标识而不会造成混乱,这里每个公司就表示一个独立的命名空间。如果两乱,这里每个公司就表示一个独立的命名空间。如果两人在同一家公司工作,其工号就不能相同了,否则会发人在同一家公司工作,其工号就不能相同了,否则会发生混乱。生混乱。2.4.1 2.4.1 为什么要引入为什么要引入命名空间命名空间 这一特点是使用命名空间的主要理由。在大型的计算这一特点是使用命名空间的主要理由。在大型的计算机程序中,往往会出现成百上千个标识符。命名空间提供机程序中,往往会

4、出现成百上千个标识符。命名空间提供了一种了一种隐藏区域标识符隐藏区域标识符的机制。通过将逻辑上相关的标的机制。通过将逻辑上相关的标识符组织成相应的命名空间,可使整个系统更加模块化。识符组织成相应的命名空间,可使整个系统更加模块化。在编程语言中,命名空间是一种特殊的作用域,它包在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域内的标识符,且本身也用一个标识符来含了处于该作用域内的标识符,且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。许多现代编程语言都支持命名空间。符组织了起来。许多现代编程语言都

5、支持命名空间。2.4.1 2.4.1 为什么要引入为什么要引入命名空间命名空间 花花括括号号括括起起来来的的部部分分称称声声明明块块。声声明明块块中中可可以以包包括括:类类、变变量量(带带有有初初始始化化)、函函数数(带带有有定定义义)等等。在在域域外外使使用用域域内内的的成成员员时时,需需加加上上名名字字空空间间名名作作为为前前缀缀,后后面面加加上上域域操操作作符符“:”。这这里里添添加加了了名名字字空空间间名名称称的的成成员员名名被被称称为为限限定定修修饰饰名名。如如:ns1:ans1:a,ns1:fun1ns1:fun1()()等等。等等。最最外外层层的的名名字字空空间间域域称称为为全全

6、局局名名字字空空间间域域(global global namespace scopenamespace scope),即文件域。),即文件域。namespace ns1 float a,b,c;fun1()声明块声明块声明块声明块2.4.2 2.4.2 如何创建命名空间如何创建命名空间命名空间名命名空间名命名空间名命名空间名2.4.2 2.4.2 如何创建命名空间如何创建命名空间 名字空间域可分层嵌套,有分层屏蔽作用。例如:名字空间域可分层嵌套,有分层屏蔽作用。例如:namespacenamespace n1 n1 namespacenamespace n2 n2/名字空间嵌套名字空间嵌套 c

7、lassclass matrix matrix 访问访问matrixmatrix,可写:,可写:n1:n2:matrix n1:n2:matrix。namespace ns1 float a,b,c;fun1()声明块声明块声明块声明块命名空间名命名空间名命名空间名命名空间名2.4.3 2.4.3 如何访问命名空间成员如何访问命名空间成员1.使用使用域操作符域操作符直接访问直接访问2.使用使用using 声明声明3.使用使用using 指令指令访问命名空间成员,有三种方法:访问命名空间成员,有三种方法:ns1:a n1:n2:matrix#includeusing namespace std;

8、namespace A int x=1;namespace B int x=2;void main()int y=x;int a=A:x;int b=B:x;coutabendl;/error C2065:x:undeclared identifier/OK例例使用使用using声明可只写一次声明可只写一次 限定修饰名限定修饰名using声明以关键字声明以关键字using开头,后面是被限开头,后面是被限定修饰的名字空间成员名,例如:定修饰的名字空间成员名,例如:using n1:n2:matrix;以后在程序中使用以后在程序中使用matrix时,就可以直接使时,就可以直接使用成员名,而不必使用

9、限定修饰名。用成员名,而不必使用限定修饰名。2.使用使用using 声明声明#includeusing namespace std;namespace A int x=1;namespace B int x=2;void main()int y=x;int a=A:x;int b=B:x;coutabendl;using A:x;int a=x;例例 使用使用using指示符,可以一次性地使名字指示符,可以一次性地使名字空间中所有成员都可以直接被使用,比空间中所有成员都可以直接被使用,比using声明更方便。声明更方便。using指示符以关键字指示符以关键字using开头,后面开头,后面是关键

10、字是关键字namespace,然后是名字空间名。,然后是名字空间名。3.使用使用using指示符指示符using namespace std;3.使用使用using指示符指示符 标准标准C+C+库中的所有组件都是在一个被称为库中的所有组件都是在一个被称为stdstd的名的名字空间中声明和定义的。因此,在采用标准字空间中声明和定义的。因此,在采用标准C+C+的平台的平台上使用标准上使用标准C+C+库中的组件,只要写上这个库中的组件,只要写上这个usingusing指示指示符,就可以直接使用符,就可以直接使用标准标准标准标准C+C+C+C+库库库库中的所有成员。中的所有成员。注意:注意:如果使用了

11、名空间如果使用了名空间stdstd,则在使用,则在使用#include#include编编译预处理命令包含头文件时,必须去掉头文件的扩展译预处理命令包含头文件时,必须去掉头文件的扩展名名.h.h,否则会出错。,否则会出错。#includeusing namespace std;namespace A int x=1;namespace B int x=2;void main()int y=x;int a=A:x;int b=B:x;coutabendl;例例using namespace A;int a=x+y;int y;通常定义变量(或对象),编译器在编译时都可以根据该通常定义变量(或对象

12、),编译器在编译时都可以根据该通常定义变量(或对象),编译器在编译时都可以根据该通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在变量(或对象)的类型知道所需内存空间的大小,从而系统在变量(或对象)的类型知道所需内存空间的大小,从而系统在变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。这种内存分配称为适当的时候为他们分配确定的存储空间。这种内存分配称为适当的时候为他们分配确定的存储空间。这种内存分配称为适当的时候为他们分配确定的存储空间。这种内存分配称为静静静静态存储分配态存储分配态存储分配态存储分

13、配。有些对象只有在程序运行时才能确定,这样编译器在编译有些对象只有在程序运行时才能确定,这样编译器在编译有些对象只有在程序运行时才能确定,这样编译器在编译有些对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预定存储空间,只能在程序运行时,系统根据时就无法为他们预定存储空间,只能在程序运行时,系统根据时就无法为他们预定存储空间,只能在程序运行时,系统根据时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为运行时的要求进行内存分配,这种方法称为运行时的要求进行内存分配,这种方法称为运行时的要求进行内存分配,这种方法称为动态存储分配动态存储分配动态

14、存储分配动态存储分配。当当当当程程程程序序序序运运运运行行行行到到到到需需需需要要要要一一一一个个个个动动动动态态态态分分分分配配配配的的的的变变变变量量量量或或或或对对对对象象象象时时时时,必必必必须须须须向向向向系系系系统统统统申申申申请请请请取取取取得得得得堆堆中中中中的的的的一一一一块块块块所所所所需需需需大大大大小小小小的的的的存存存存贮贮贮贮空空空空间间间间,用用用用于于于于存存存存贮贮贮贮该该该该变变变变量量量量或或或或对对对对象象象象。当当当当不不不不再再再再使使使使用用用用该该该该变变变变量量量量或或或或对对对对象象象象时时时时,要要要要显显显显式式式式释释释释放放放放它它它

15、它所所所所占占占占用用用用的的的的存存存存贮贮贮贮空空空空间间间间,这这这这样样样样系系系系统统统统就就就就能能能能对对对对该该该该堆堆堆堆空空空空间间间间进进进进行行行行再再再再次次次次分分分分配配配配,做做做做到到到到重复使用有限的资源。重复使用有限的资源。重复使用有限的资源。重复使用有限的资源。2.8 2.8 动态内存的分配与释放动态内存的分配与释放 在程序运行时可使用的内存空间称为在程序运行时可使用的内存空间称为堆堆(heap)heap),堆内存就是在程序运行时获得堆内存就是在程序运行时获得的内存空间,在程序编译和连接时不必确定的内存空间,在程序编译和连接时不必确定它的大小,它随着程序

16、的运行过程变化,时它的大小,它随着程序的运行过程变化,时大时小,因此堆内存是动态的,堆内存也称大时小,因此堆内存是动态的,堆内存也称为动态内存。为动态内存。new运算符用于申请所需的内存空间,返回指定类型的一个指针(常量,即内存空间首地址)。它的语法格式为:指针变量指针变量 =new 数据类型;其中,指针变量应预先声明,指针变量指向的数据类型与new后面的数据类型相同。若申请成功,则返回分配空间的首地址赋给指针变量;否则(如没有足够的内存空间)返回0(NULL一个空指针)。例如:例如:int *p;p=new int;(20);系统为指针p p开辟了一个用来保存int类型数据的内存空间(在申请

17、时,也可以进行初始化)。new 运算符在在在在C+C+C+C+中,申请和释放堆中分配的存贮空间,分别使用中,申请和释放堆中分配的存贮空间,分别使用中,申请和释放堆中分配的存贮空间,分别使用中,申请和释放堆中分配的存贮空间,分别使用newnewnewnew和和和和deletedeletedeletedelete两个运算符来完成,其使用的格式如下:两个运算符来完成,其使用的格式如下:两个运算符来完成,其使用的格式如下:两个运算符来完成,其使用的格式如下:例如:例如:int *p;p=new int20;系统为指针p p开辟了一个用来保存int类型数组的内存空间,数组中有20个元素。也可以用new运

18、算符申请一块保存数组的内存空间,即动态创建一个数组动态创建一个数组动态创建一个数组动态创建一个数组。格式为:指针变量new 数据类型数组大小;其中,数组大小给出数数组组元元素素的的个个数数,指针指向分配的内存空间首首地地址址,指针的类型与new后的数据类型相同。new 运算符 当程序中不再使用由运算符new申请的某个内存空间时,可以用delete运算符释放它。它的语法格式为:delete 指针变量;delete 常量指针变量;它的功能是释放由new申请到的内存空间。其中指针变量是指向需要释放内存空间的指针变量名字,并且delete只是删除动态内存空间,并不是将指针变量本身删除。常量可以省略,且

19、不用考虑数组的维数。int *p1=new int;int *p2=new int 20;delete p1;delete p2;delete 运算符v 1.1.newnewnewnew 运算符返回的是一个指向所分配类型变量(对象)运算符返回的是一个指向所分配类型变量(对象)的的指针指针。对所创建的变量或对象,都是通过该指针来间接操作。对所创建的变量或对象,都是通过该指针来间接操作的,而的,而动态创建的对象本身没有名字动态创建的对象本身没有名字动态创建的对象本身没有名字动态创建的对象本身没有名字。v 2.2.一般定义变量和对象时要用标识符命名,称一般定义变量和对象时要用标识符命名,称命名对象命

20、名对象命名对象命名对象,而,而动态所创建的变量或对象称动态所创建的变量或对象称无名对象无名对象无名对象无名对象。堆区是不会自动在分配。堆区是不会自动在分配时做初始化的(包括清零),所以必须用初始化式(时做初始化的(包括清零),所以必须用初始化式()来显式来显式初始化。但初始化。但不可对动态数组初始化不可对动态数组初始化不可对动态数组初始化不可对动态数组初始化v 3.3.指针变量指针变量newnew 数据类型数据类型 数组大小数组大小;请注意请注意“数组大小数组大小”不是常量表达式,即它的值不必在编不是常量表达式,即它的值不必在编译时确定,可以在运行时确定。变量译时确定,可以在运行时确定。变量

21、n n 在编译时没有确定的在编译时没有确定的值,而是在运行中输入,值,而是在运行中输入,按运行时所需分配堆空间按运行时所需分配堆空间按运行时所需分配堆空间按运行时所需分配堆空间,这一点,这一点是动态分配的优点,可克服数组是动态分配的优点,可克服数组“大开小用大开小用”的弊端,在表、的弊端,在表、排序与查找中的算法,若用动态数组,通用性更好。排序与查找中的算法,若用动态数组,通用性更好。说明:说明:v 4.4.动态分配失败动态分配失败动态分配失败动态分配失败。返回一个空指针(。返回一个空指针(NULLNULL),表示发生),表示发生了异常,堆资源不足,分配失败。因此,一定要检查分配的内了异常,堆

22、资源不足,分配失败。因此,一定要检查分配的内存指针是否为空,如果是空指针,则不能引用这个指针,否则存指针是否为空,如果是空指针,则不能引用这个指针,否则将造成系统崩溃。将造成系统崩溃。说明:说明:int *p=new int 20;if(p!=NULL)else v 5.5.指针删除与堆空间释放指针删除与堆空间释放指针删除与堆空间释放指针删除与堆空间释放。删除一个指针。删除一个指针p;p;实际意实际意思是删除了思是删除了p p所指的目标(变量或对象等),释放了它所占的所指的目标(变量或对象等),释放了它所占的堆空间,而不是删除本身,释放堆空间后,成了堆空间,而不是删除本身,释放堆空间后,成了空

23、悬指空悬指空悬指空悬指针针针针。v 6.6.动态分配的变量或对象的生命期动态分配的变量或对象的生命期动态分配的变量或对象的生命期动态分配的变量或对象的生命期。无名对象的生无名对象的生无名对象的生无名对象的生命期并不依赖于建立它的作用域,比如在函数中建立的动态对命期并不依赖于建立它的作用域,比如在函数中建立的动态对命期并不依赖于建立它的作用域,比如在函数中建立的动态对命期并不依赖于建立它的作用域,比如在函数中建立的动态对象在函数返回后仍可使用象在函数返回后仍可使用象在函数返回后仍可使用象在函数返回后仍可使用。我们也称堆空间为自由空间(我们也称堆空间为自由空间(free free storesto

24、re)就是这个原因。)就是这个原因。但必须记住释放该对象所占堆空间,但必须记住释放该对象所占堆空间,并只能释放一次,在函数内建立,而在函数外释放是一件很容并只能释放一次,在函数内建立,而在函数外释放是一件很容易易失控失控失控失控的事,往往会出错。的事,往往会出错。说明:说明:v 7 7内存泄漏(内存泄漏(内存泄漏(内存泄漏(memory leakmemory leakmemory leakmemory leak)和重复释放)和重复释放)和重复释放)和重复释放。newnew与与delete delete 是配对使用的,是配对使用的,deletedelete只能释放堆空间。如果只能释放堆空间。如果

25、newnew返返回的指针值丢失,则所分配的堆空间无法回收,称回的指针值丢失,则所分配的堆空间无法回收,称内存泄漏内存泄漏内存泄漏内存泄漏,同一空间重复释放也是危险的,因为该空间可能已另分配,所同一空间重复释放也是危险的,因为该空间可能已另分配,所以必须妥善保存以必须妥善保存newnew返回的指针,以保证不发生内存泄漏,也返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放堆内存空间。必须保证不会重复释放堆内存空间。#include using namespace std;void main()int n;/定义数组元素的个数定义数组元素的个数定义数组元素的个数定义数组元素的个数 int*p

26、;coutn;if(p=new intn)=0)cout cant allocate more memory,terminating.endl;exit(1);/检查动态分配内存检查动态分配内存检查动态分配内存检查动态分配内存,若不成功若不成功若不成功若不成功,退出系统退出系统退出系统退出系统 【例例例例2.42.42.42.4】从堆内存中获取一个从堆内存中获取一个从堆内存中获取一个从堆内存中获取一个整型数组,整型数组,整型数组,整型数组,赋值后并打印出来赋值后并打印出来赋值后并打印出来赋值后并打印出来。(P19)(P19)(P19)(P19)【例例例例2.42.42.42.4】从堆内存中获取

27、一个从堆内存中获取一个从堆内存中获取一个从堆内存中获取一个整型数组,整型数组,整型数组,整型数组,赋值后并打印出来赋值后并打印出来赋值后并打印出来赋值后并打印出来。(P19)(P19)(P19)(P19)for(int i=0;in;i+)pi=i*2;coutNow output the array:endl;for(i=0;in;i+)coutpi ;coutendl;delete p;/释放内存空间释放内存空间释放内存空间释放内存空间Please input the length of the array:6Now output the array:0 2 4 6 8 102.10 2.

28、10 引引 用用 引用是引用是C+的一个特殊的数据类型描述,用于在程的一个特殊的数据类型描述,用于在程序的不同部分使用两个以上的变量名指向同一地址,使得序的不同部分使用两个以上的变量名指向同一地址,使得对其中任一个变量的操作实际上都是对同一地址单元进行对其中任一个变量的操作实际上都是对同一地址单元进行的。在这种两个以上变量名的关系上,被声明为引用类型的。在这种两个以上变量名的关系上,被声明为引用类型的变量名则是实际变量名的的变量名则是实际变量名的别名别名。引用运算符为引用运算符为&,声明引用的一般形式为:,声明引用的一般形式为:数据类型数据类型&引用变量名引用变量名=变量名;变量名;对引用操作

29、,实际上就是对被引用的变量操作。引用对引用操作,实际上就是对被引用的变量操作。引用不是值,不占存储空间,声明引用时,目标的存储状态不不是值,不占存储空间,声明引用时,目标的存储状态不会改变。引用一旦被初始化,就不能再重新赋值。会改变。引用一旦被初始化,就不能再重新赋值。#include void main()int num=50;int&ref=num;ref+=10;coutnum=numendl;cout ref=refendl;num+=40;cout num=numendl;coutref=refendl;【例例2.52.5】引用举例。引用举例。num=60num=60ref=60re

30、f=60num=100num=100ref=100ref=100关于引用的说明:关于引用的说明:(1)(1)在一行上声明多个引用型变量在一行上声明多个引用型变量(函数函数)名时,要在每名时,要在每个变量个变量(函数函数)名前都冠以名前都冠以“&”符号。符号。(2)(2)引用不是变量,所以引用本身不能被修改,在程序引用不是变量,所以引用本身不能被修改,在程序中对引用的存取都是对它所引用的变量的存取。中对引用的存取都是对它所引用的变量的存取。(3)(3)一个变量被声明为引用时必须进行初始化,除非这一个变量被声明为引用时必须进行初始化,除非这个引用是用作函数的参数或返回值,为引用提供的初始值个引用是

31、用作函数的参数或返回值,为引用提供的初始值应为变量。引用一旦被初始化应为变量。引用一旦被初始化,就不能再重新赋值。就不能再重新赋值。(4)(4)由于引用不是变量,所以,不能说明引用的引用,由于引用不是变量,所以,不能说明引用的引用,也不能说明数组元素的类型为引用数组,或指向引用的指也不能说明数组元素的类型为引用数组,或指向引用的指针。例如:针。例如:int&a5;/错误错误 int&*p;/错误错误关于引用的说明:关于引用的说明:(5)(5)由于指针也是变量,因此可以说明对指针变量的引由于指针也是变量,因此可以说明对指针变量的引用。例如:用。例如:int*a;int*&p=a;int b;p=

32、&b;/a/a指向变量指向变量b b (6)(6)引用与指针不同。指针的值是某一变量的内存单元引用与指针不同。指针的值是某一变量的内存单元地址,而引用则与初始化它的变量具有相同的内存单元地地址,而引用则与初始化它的变量具有相同的内存单元地址。指针是个变量,可以把它再赋值成其它的地址,然而,址。指针是个变量,可以把它再赋值成其它的地址,然而,建立引用时必须进行初始化并且决不会再指向其它不同的建立引用时必须进行初始化并且决不会再指向其它不同的变量。变量。(7)(7)要注意区分引用运算符和地址运算符的区别。要注意区分引用运算符和地址运算符的区别。int num=50;int&ref=num;int*

33、p=&ref;关于引用的说明:关于引用的说明:(8)(8)可以用一个引用初始化另一个引用。例如:可以用一个引用初始化另一个引用。例如:int num=50;int&ref1=num;int&ref2=ref1;ref2=100;/num/num为为100100 其中其中ref2ref2也是对也是对numnum的引用。的引用。(9)(9)函数调用可以作为函数调用可以作为 左值左值 引用表达式是一个左值,因此它可以出现在形、实参引用表达式是一个左值,因此它可以出现在形、实参数的任何一方。若一个函数返回了引用,那么该函数的调数的任何一方。若一个函数返回了引用,那么该函数的调用也可以被赋值。一般说,当

34、返回值不是本函数内定义的用也可以被赋值。一般说,当返回值不是本函数内定义的局部变量时就可以返回一个引用。在通常情况下,引用返局部变量时就可以返回一个引用。在通常情况下,引用返回值只用在需对函数的调用重新赋值的场合,也就是对函回值只用在需对函数的调用重新赋值的场合,也就是对函数的返回值重新赋值的时候。避免将局部作用域中变量的数的返回值重新赋值的时候。避免将局部作用域中变量的地址返回,就使函数调用表达式作为左值来使用。地址返回,就使函数调用表达式作为左值来使用。【例例2.8】【例例2.9】28 在在C+C+中,任何命名的存储区域都称为中,任何命名的存储区域都称为左值,左值,这这个存储区域的内容可以

35、被修改。任何未命名的存储区个存储区域的内容可以被修改。任何未命名的存储区域,如堆栈中创建的临时变量,称为域,如堆栈中创建的临时变量,称为右值右值;右值表示;右值表示一个表达式运算后的值,如果是基本类型,就不能修一个表达式运算后的值,如果是基本类型,就不能修改;如果是用户自定义类型,就可以被修改,且称为改;如果是用户自定义类型,就可以被修改,且称为可修改的右值。可修改的右值。对于int a(10),&ra=a;语句,下列描述错误的是()。ra是变量a的引用,即为变量的别名ra的值为10ra的地址值为&a改变ra的值为20,变量a的值仍为10ABCD提交可为此题添加文本、图片、公式等解析,且需将内

36、容全部放在本区域内。正常使用需3.0以上版本上述语句中定义了基本整型变量a,其初始值为10,ra为变量a的引用,即a的别名,变量a的值即为引用ra的值,对ra的值进行修改,实质上是修改了变量a的值,ra的地址值即为变量a的地址值&a,实际上取引用ra的地址值没有任何意义。答案解析答案解析单选题1分2.11 const2.11 const修饰符修饰符#define PI 3.1415926const double PI=3.1415926;这个常量是有类型的,它有地址,可以用指针指向这个常量是有类型的,它有地址,可以用指针指向这个值,但不能修改它。这个值,但不能修改它。C+C+建议用建议用con

37、stconst取代取代#define#define定义常量。定义常量。与与#define#define定义的常量有所不同,定义的常量有所不同,constconst定义的常量定义的常量可以有自己的数据类型,这样可以有自己的数据类型,这样C+C+编译程序可以进行更编译程序可以进行更加严格的类型检查,具有良好的编译时的检测性。加严格的类型检查,具有良好的编译时的检测性。(1)(1)使用使用constconst修饰符定义常量时,必须初始化;修饰符定义常量时,必须初始化;(2)(2)函数参数也可以用函数参数也可以用constconst说明,用于保证实参在说明,用于保证实参在该函数内部不被改动,大多数该函

38、数内部不被改动,大多数C+C+编译器能对具有编译器能对具有constconst参数的函数进行更好的代码优化。例如,通过函数参数的函数进行更好的代码优化。例如,通过函数maxmax求求出整型数组出整型数组a100a100中的最大值,函数原型应该是:中的最大值,函数原型应该是:int max(const int*pa);这样做的目的是确保原数组的数据不被破坏,即在这样做的目的是确保原数组的数据不被破坏,即在函数中对数组元素的操作只许读,不许写。函数中对数组元素的操作只许读,不许写。关于关于const的说明:的说明:const与指针一起使用的组合情况与指针一起使用的组合情况:(1)(1)指向常量的指

39、针指向常量的指针 指向常量的指针是一个指向常量的指针变量。指向常量的指针是一个指向常量的指针变量。const char*pc=abcd;声明指向常量的指针变量声明指向常量的指针变量pcpc,指向一个字符串常量。,指向一个字符串常量。由于使用了由于使用了constconst,不允许改变指针所指的常量,因此,不允许改变指针所指的常量,因此以下语句是错误的:以下语句是错误的:pc3=x;但是由于但是由于pcpc是一个指向常量的普通指针变量,不是常是一个指向常量的普通指针变量,不是常指针,因此可以改变指针,因此可以改变pcpc的值。例如以下语句是允许的:的值。例如以下语句是允许的:pc=jkkk;co

40、nst与指针一起使用的组合情况与指针一起使用的组合情况:(2)(2)常指针常指针 常指针是指针本身,而不是它指向的对象声明为常常指针是指针本身,而不是它指向的对象声明为常量。例如:量。例如:char*const pc=abcd;/常指针常指针这个语句的含义为:声明一个名为这个语句的含义为:声明一个名为pcpc的指针变量,该指的指针变量,该指针是指向字符型数据的常指针,用针是指向字符型数据的常指针,用“abcdabcd”的地址初始的地址初始化该常指针。创建一个常指针,就是创建不能移动的固化该常指针。创建一个常指针,就是创建不能移动的固定指针,但是它所指的数据可以改变。例如:定指针,但是它所指的数

41、据可以改变。例如:pc3=x;/合法合法 pc=dfasdfa;/不合法不合法const与指针一起使用的组合情况与指针一起使用的组合情况:(3)(3)指向常量的常指针指向常量的常指针 整个指针本身不能改变,它所指向的值也不能改变。整个指针本身不能改变,它所指向的值也不能改变。要声明一个指向常量的常指针,二者都要声明为要声明一个指向常量的常指针,二者都要声明为constconst。const char*const pc=abcd;这个语句的含义为:声明一个名为这个语句的含义为:声明一个名为pcpc的指针变量,它的指针变量,它是一个指向字符型常量的常指针,用是一个指向字符型常量的常指针,用“abc

42、dabcd”的地址初始的地址初始化该指针。以下两个语句都是错误的:化该指针。以下两个语句都是错误的:pc3=x;/错误,不能改变指针所指的值错误,不能改变指针所指的值 pc=dfasdfa;/错误,不能改变指针本身错误,不能改变指针本身2.13 C+2.13 C+语言中函数的新特性语言中函数的新特性2.13.22.13.2 内联(内联(inlineinline)函数)函数2.13.32.13.3 带缺省参数的函数带缺省参数的函数2.13.42.13.4 函数重载(函数重载(overloadoverload)2.13.52.13.5 函数模板(函数模板(function templatefunc

43、tion template)2.13.22.13.2内联(内联(inlineinline)函数)函数u在在执执行行程程序序过过程程中中如如果果要要进进行行函函数数调调用用,则则系系统统要要将将程程序序当当前前的的一一些些状状态态信信息息存存到到栈栈中中,之之后后进进行行虚虚虚虚实实实实结结结结合合合合,同同时时转转到到函函数数的的代代码码处处去去执执行行函函数数体体语语句句,这这些些参参数数保保存存与与传传递递的的过过程程中中需需要要时时间间和和空空间间的的开开销销,使使得得程程序序执执行行效效率率降降低低,特特别别是是在在程程序序频频频频繁繁繁繁地地地地进进进进行行行行函函函函数数数数调调调

44、调用用用用以以及及函函数数代代码码段段比比较较少少时时,这这个个问问题题会会变变得得更更为为严严重重。为为了了解解决决这这个个问问题,题,C+C+引入了内联函数机制。引入了内联函数机制。u使使用用内内联联函函数数是是一一种种用用空空空空间间间间换换换换时时时时间间间间的的措措施施,若若内内联联函函数数较较长长,且且调调用用太太频频繁繁时时,程程序序将将加加长长很很多多。因因此此,通通常常只只只只有有有有较较较较短短短短的的的的函函函函数数数数才才才才定定定定义义义义为为为为内内内内联联联联函函函函数数数数,对对于于较较长长的的函函数数最最好好作为一般函数处理。作为一般函数处理。2.13.22.

45、13.2内联(内联(inlineinline)函数)函数一般情况下,我们对内联函数做如下的一般情况下,我们对内联函数做如下的限制:限制:(1)(1)不能有递归不能有递归(2)(2)不能包含静态数据不能包含静态数据(3)(3)不能包含循环不能包含循环(4)(4)不能包含不能包含switchswitch和和gotogoto语句语句(5)(5)不能包含数组不能包含数组若若一一个个内内联联函函数数定定义义不不满满足足以以上上限限制制,则则编编译译系系统统把它当作普通函数对待。把它当作普通函数对待。【例例2.112.11】内联函数的使用。内联函数的使用。332.13.32.13.3带默认参数的函数带默认

46、参数的函数如如果果在在函函数数说说明明或或函函数数定定义义中中为为形形参参指指定定一一个个默默认认值值,则则称称此此函函数数为为带带默默认认参参数数的的函函数数。当当函函数数调调用用发发生生后后,在在形参表中等号后的各形参表中等号后的各“默认值默认值”将起实参的传递作用。将起实参的传递作用。void fun(int a,int b=1,int c=4,int d=5);如如果果函函数数有有多多个个默默认认参参数数,则则默默认认参参数数必必须须是是从从从从右右右右向向向向左左左左定定义义,并并且且在在一一个个默默认认参参数数的的右右边边不不能能有有未未指指定定默默认认值值的参数。的参数。void

47、 fun(int a=3,int b=6,int c,int d);void fun(int a=65,int b=3,int c,int d=3);需需要要特特别别注注意意的的是是如如果果在在函函数数原原型型的的声声明明中中设设置置了了函函数数参参数数的的默默认认值值,则则不不可可再再在在函函数数定定义义的的头头部部重重复复设设置置,否则编译时将出现错误信息。否则编译时将出现错误信息。void fun(int,int=1,int=4,int=5);35思考下列关于设置缺省参数值的描述中,错误的是()。可对函数的部分参数或全部参数设置缺省值在有函数原型时,缺省值应该设置在函数原型中,而不是函数

48、定义时设置函数缺省参数值时,只可用常量,不可用含有变量的表达式设置函数参数默认值应从右向左设置ABCD提交可为此题添加文本、图片、公式等解析,且需将内容全部放在本区域内。正常使用需3.0以上版本函数的缺省参数从最右边开始,中间不能间隔非缺省参数;可以对函数的部分或全部参数设置缺省值;在有函数原型时,缺省值应该设置在函数原型中,而不是函数定义时;缺省值可以使用常量,也可以是变量或含有变量的表达式。单选题1分答案解析2.13.42.13.4函数重载(函数重载(overloadoverload)C+C+编编译译系系统统允允许许为为两两个个或或两两个个以以上上的的函函数数取取相相同同的的函函数数名名,

49、但但是是形形参参的的个个数数或或者者形形参参的的类类型型不不应应相相同同,编编译译系系统统会会根根据据实实参参和和形形参参的的类类型型及及个个数数的的最最佳佳匹匹配配,自自动动确确定定调调用用哪哪一一个个函函数数,这这就就是是所所谓谓的的函函函函数数数数重载。重载。重载。重载。函函数数重重载载无无需需特特别别声声明明,只只要要所所定定义义的的函函数数与与已已经经定定义义的的同同名名函函数数形形参参形形式式(类类型型、个个数数)不不完完全全相相同,同,C+C+编译器就认为是函数的重载。编译器就认为是函数的重载。【例例2.122.12】重载函数应用举例重载函数应用举例 3 6在使用重载函数时要注意

50、在使用重载函数时要注意:不可以定义两个具有相同名称、相同参数类型和不可以定义两个具有相同名称、相同参数类型和相同参数个数,只是函数返回值不同的函数。相同参数个数,只是函数返回值不同的函数。int func(int x);float func(int x);如如果果某某个个函函数数参参数数有有缺缺省省值值,必必须须保保证证其其参参数数缺缺省后调用形式不与其它函数混淆。省后调用形式不与其它函数混淆。int f(int a,float b);void f(int a,float b,int c=0);函函数数调调用用语语句句:f(10,2.0);具具有有二二义义性性,既既可可以以调调用用第第一一个个


注意事项

本文(《面向对象程序设计》课件第2章 C++对C的扩充.pptx)为本站会员(bubibi)主动上传,文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知文库网(点击联系客服),我们立即给予删除!




关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

文库网用户QQ群:731843829  微博官方号:文库网官方   知乎号:文库网

Copyright© 2025 文库网 wenkunet.com 网站版权所有世界地图

经营许可证编号:粤ICP备2021046453号   营业执照商标

1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png