法语学习3C语法基础课件

上传人:博****1 文档编号:570667700 上传时间:2024-08-05 格式:PPT 页数:46 大小:474KB
返回 下载 相关 举报
法语学习3C语法基础课件_第1页
第1页 / 共46页
法语学习3C语法基础课件_第2页
第2页 / 共46页
法语学习3C语法基础课件_第3页
第3页 / 共46页
法语学习3C语法基础课件_第4页
第4页 / 共46页
法语学习3C语法基础课件_第5页
第5页 / 共46页
点击查看更多>>
资源描述

《法语学习3C语法基础课件》由会员分享,可在线阅读,更多相关《法语学习3C语法基础课件(46页珍藏版)》请在金锄头文库上搜索。

1、C+语法基法基础重重庆邮电大学大学计算机科学与技算机科学与技术学院学院冯潇法语学习3C语法基础2回顾回顾#include#include#include#includeusingnamespacestd;usingnamespacestd;/ /使用标准名字空间使用标准名字空间使用标准名字空间使用标准名字空间stdstd intmain()intmain() stringstringname;name;/C+/C+标准库提供的字符串类标准库提供的字符串类标准库提供的字符串类标准库提供的字符串类stringstring coutcoutinputname:;name;name; coutHell

2、o,namecoutHello,name,welcometoC+world!,welcometoC+world!endlendl;return0;return0; 2024/8/53空类型空类型void整整型型int字符型字符型实实型型逻辑型逻辑型bool单字符型单字符型char宽字符型宽字符型w_char单精度型单精度型float双精度型双精度型double指指针针type*结结构构struct枚枚举举enum类类class非基本数据类型非基本数据类型数据类型数据类型基本数据类型基本数据类型联联合合union数数组组type说明:说明:说明:说明:VC+VC+中整型中整型中整型中整型数据占数

3、据占数据占数据占4B4B,字符,字符,字符,字符型占型占型占型占1B1B,floatfloat型型型型占占占占4B4B,doubledouble型型型型占占占占8B8B,指针占指针占指针占指针占4B4B2024/8/54本次课内容本次课内容 内联函数、带默认值的函数内联函数、带默认值的函数内联函数、带默认值的函数内联函数、带默认值的函数 理解并正确运用引用、函数重载理解并正确运用引用、函数重载理解并正确运用引用、函数重载理解并正确运用引用、函数重载 初步理解函数模板初步理解函数模板初步理解函数模板初步理解函数模板 C+C+中的四种类型转换中的四种类型转换中的四种类型转换中的四种类型转换 运算符

4、运算符运算符运算符static_caststatic_cast、const_castconst_cast、reinterpret_castreinterpret_castdynamic_castdynamic_cast2024/8/55说明程序说明程序运行结果运行结果#include#includeusingnamespacestd;usingnamespacestd;intboxVolume(intlengthintboxVolume(intlength=1=1,intwidth,intwidth=1=1,intheight,intheight=1=1););intmain()intmain

5、() coutThedefaultboxvolumeis:coutThedefaultboxvolumeis:boxVolume();boxVolume(); coutnnThevolumeofaboxwithlength10,ncoutnnThevolumeofaboxwithlength10,nwidth1andheight1is:width1andheight1is:boxVolume(10);boxVolume(10); coutnnThevolumeofaboxwithlength10,ncoutnnThevolumeofaboxwithlength10,nwidth5andheig

6、ht1is:width5andheight1is:boxVolume(10,5);boxVolume(10,5);coutnnThevolumeofaboxwithlength10,ncoutnnThevolumeofaboxwithlength10,nwidth5andheight2is:width5andheight2is:boxVolume(10,5,2)boxVolume(10,5,2)endl;endl;return0;return0; intboxVolume(intlength,intwidth,intheight)intboxVolume(intlength,intwidth,

7、intheight) returnlength*width*height;returnlength*width*height; 6说明说明 默认参数一般在函数声明中提供默认参数一般在函数声明中提供默认参数一般在函数声明中提供默认参数一般在函数声明中提供 默认参数默认参数默认参数默认参数必须放在参数表的最后必须放在参数表的最后必须放在参数表的最后必须放在参数表的最后 默认参数的声明必须出现在函数调用之前默认参数的声明必须出现在函数调用之前默认参数的声明必须出现在函数调用之前默认参数的声明必须出现在函数调用之前2024/8/57内联函数内联函数#include#includeusingnamesp

8、acestd;usingnamespacestd;/inline/inline限定限定限定限定boxVolumeboxVolume函数为内联函数函数为内联函数函数为内联函数函数为内联函数inlineinlinevoidboxVolume(intlengthvoidboxVolume(intlength=1=1,intwidth,intwidth=1=1,intheight,intheight=1=1) ) intvol;intvol;vol=length*width*height;vol=length*width*height; intmain()intmain() boxVolume();b

9、oxVolume(); boxVolume(10);boxVolume(10); boxVolume(10,5);boxVolume(10,5);boxVolume(10,5,2);boxVolume(10,5,2);return0;return0; 编译器秘密将函数调用语句编译器秘密将函数调用语句编译器秘密将函数调用语句编译器秘密将函数调用语句boxVolumeboxVolume() (),根据参数替换为,根据参数替换为,根据参数替换为,根据参数替换为length*length*width*heightwidth*height8内联函数内联函数-以空间换取时间以空间换取时间 函数调用存在时间

10、上的代价函数调用存在时间上的代价函数调用存在时间上的代价函数调用存在时间上的代价保存调用点地址,开辟、销毁栈,返回调用点保存调用点地址,开辟、销毁栈,返回调用点保存调用点地址,开辟、销毁栈,返回调用点保存调用点地址,开辟、销毁栈,返回调用点 内联函数是一种以空间效率换取时间效率的机制内联函数是一种以空间效率换取时间效率的机制内联函数是一种以空间效率换取时间效率的机制内联函数是一种以空间效率换取时间效率的机制把函数代码的多份副本插入程序中把函数代码的多份副本插入程序中把函数代码的多份副本插入程序中把函数代码的多份副本插入程序中( (通常会使程序变长、通常会使程序变长、通常会使程序变长、通常会使程

11、序变长、体积变大体积变大体积变大体积变大) ) 内联函数的显式定义格式为:内联函数的显式定义格式为:内联函数的显式定义格式为:内联函数的显式定义格式为:inlineinline() 9几点说明几点说明 内联函数一般只有内联函数一般只有内联函数一般只有内联函数一般只有1 15 5条语句的函数条语句的函数条语句的函数条语句的函数 内联函数体内不能有复杂的控制语句内联函数体内不能有复杂的控制语句内联函数体内不能有复杂的控制语句内联函数体内不能有复杂的控制语句(swith(swith、whilewhile、forfor等等等等等等等等)( )(对部分表示怀疑对部分表示怀疑对部分表示怀疑对部分表示怀疑)

12、 ) 递归函数不能定义为内联函数递归函数不能定义为内联函数递归函数不能定义为内联函数递归函数不能定义为内联函数 内联函数只能先定义后使用内联函数只能先定义后使用内联函数只能先定义后使用内联函数只能先定义后使用2024/8/510VC6中设置内联函数展开中设置内联函数展开 ALT+F72024/8/511未限定未限定inline的的boxVolume调用调用 反汇编程序代码,在反汇编程序代码,在反汇编程序代码,在反汇编程序代码,在VCVC下可以看到:下可以看到:下可以看到:下可以看到:函数的参数按照函数的参数按照函数的参数按照函数的参数按照从右从右从右从右到左到左到左到左的顺序压栈的顺序压栈的顺

13、序压栈的顺序压栈指令指令指令指令callcall发起函数发起函数发起函数发起函数boxVolumeboxVolume() ()的调用的调用的调用的调用2024/8/512限定限定inline的的boxVolume调用调用 从反汇编结果可从反汇编结果可从反汇编结果可从反汇编结果可以看出:以看出:以看出:以看出:主函数中的函数主函数中的函数主函数中的函数主函数中的函数调用均被换成了调用均被换成了调用均被换成了调用均被换成了函数体内的乘法函数体内的乘法函数体内的乘法函数体内的乘法运算运算运算运算2024/8/513 inlineinline限定符只是程序员对编译器的限定符只是程序员对编译器的限定符只

14、是程序员对编译器的限定符只是程序员对编译器的建议建议建议建议,而,而,而,而非强制性的非强制性的非强制性的非强制性的 inlineinline限定符应该只适用于小的、经常使用的限定符应该只适用于小的、经常使用的限定符应该只适用于小的、经常使用的限定符应该只适用于小的、经常使用的函数函数函数函数 使用内联函数可以减少程序执行时间,但是会使用内联函数可以减少程序执行时间,但是会使用内联函数可以减少程序执行时间,但是会使用内联函数可以减少程序执行时间,但是会增加程序长度增加程序长度增加程序长度增加程序长度 为了调试方便,在程序处于调试阶段时,所有为了调试方便,在程序处于调试阶段时,所有为了调试方便,

15、在程序处于调试阶段时,所有为了调试方便,在程序处于调试阶段时,所有内联函数都不被实现内联函数都不被实现内联函数都不被实现内联函数都不被实现 编译器可以忽略编译器可以忽略编译器可以忽略编译器可以忽略inlineinline限定符,并且限定符,并且限定符,并且限定符,并且对于除了对于除了对于除了对于除了小函数以外的函数,通常会这样做小函数以外的函数,通常会这样做小函数以外的函数,通常会这样做小函数以外的函数,通常会这样做2024/8/514从很熟悉的从很熟悉的问题谈起问题谈起#include#includeusingnamespacestd;usingnamespacestd; voids*p1,

16、int*p2)voids*p1,int*p2) inttemp;inttemp; temp=*p1;temp=*p1;*p1=*p2;*p1=*p2;*p2=temp;*p2=temp; intmain()intmain() intx1=3,x2=5;intx1=3,x2=5; coutbeforeswap,x1=x1,x2=x2endl;coutbeforeswap,x1=x1,x2=x2endl;s);s);coutafterswap,x1=x1,x2=x2endl;coutafterswap,x1=x1,x2=x2endl;return0;return0; 15对比对比前一程序前一程序#

17、include#include#include#includeusingnamespacestd;usingnamespacestd; voids*one,int*another)voids*one,int*another) inttemp;inttemp; temp=*one;temp=*one;*one=*another;*one=*another;*another=temp;*another=temp; voidprint(voidprint(stringstringhint,intone,intanother)hint,intone,intanother) couthint,one=o

18、ne,another=couthint,one=one,another=anotherendl;anotherendl; 16对比前一程序对比前一程序intmain()intmain() intone=3,another=5;intone=3,another=5; print(print(交换前交换前交换前交换前,oneone, ,anotheranother); );swap(&swap(&oneone,&,&anotheranother); );print(print(交换后交换后交换后交换后,oneone, ,anotheranother); );return0;return0; / /

19、前后两个程序哪个更好,为什么?前后两个程序哪个更好,为什么?前后两个程序哪个更好,为什么?前后两个程序哪个更好,为什么?17说明说明 标识符的命名应做到名副其实,以数字系列命名标识符的命名应做到名副其实,以数字系列命名标识符的命名应做到名副其实,以数字系列命名标识符的命名应做到名副其实,以数字系列命名(x1(x1、x2x2,.xN).xN),则完全没有提供正确信息或不能体现,则完全没有提供正确信息或不能体现,则完全没有提供正确信息或不能体现,则完全没有提供正确信息或不能体现作者意图作者意图作者意图作者意图 函数名应当是动词或动词短语,如函数名应当是动词或动词短语,如函数名应当是动词或动词短语,

20、如函数名应当是动词或动词短语,如deleteNodedeleteNode、savesave 代码之间应减少重复和依赖代码之间应减少重复和依赖代码之间应减少重复和依赖代码之间应减少重复和依赖多次重复出现的代码段应想办法将其模块化为函数多次重复出现的代码段应想办法将其模块化为函数多次重复出现的代码段应想办法将其模块化为函数多次重复出现的代码段应想办法将其模块化为函数最小权限原则最小权限原则最小权限原则最小权限原则 整洁代码的编写虽然也遵循很多规范,但也有较强主整洁代码的编写虽然也遵循很多规范,但也有较强主整洁代码的编写虽然也遵循很多规范,但也有较强主整洁代码的编写虽然也遵循很多规范,但也有较强主观

21、性,需要多加练习才能掌握大量的实用技巧并积累观性,需要多加练习才能掌握大量的实用技巧并积累观性,需要多加练习才能掌握大量的实用技巧并积累观性,需要多加练习才能掌握大量的实用技巧并积累出优化代码和程序结构的经验出优化代码和程序结构的经验出优化代码和程序结构的经验出优化代码和程序结构的经验2024/8/518引用引用(reference) C+C+引入引入引入引入“ “引用引用引用引用” ”的目的的目的的目的的目的指针存在着相当大的安全隐患指针存在着相当大的安全隐患指针存在着相当大的安全隐患指针存在着相当大的安全隐患 引用,即变量的别名引用,即变量的别名引用,即变量的别名引用,即变量的别名 引用的

22、声明格式引用的声明格式引用的声明格式引用的声明格式类型类型类型类型 &引用名引用名引用名引用名 =变量名变量名变量名变量名;intintnumber=10;number=10;int&ref=number;int&ref=number; 声明引用时,必须对其进行声明引用时,必须对其进行声明引用时,必须对其进行声明引用时,必须对其进行初始化初始化初始化初始化numbernumberrefref2024/8/519观察程序观察程序#include#includeusingnamespacestd;usingnamespacestd;intmain()intmain() intnumber=1;in

23、tnumber=1;int*pointer;/int*pointer;/指针未初始化,编译器不报错指针未初始化,编译器不报错指针未初始化,编译器不报错指针未初始化,编译器不报错int&ref=number;/int&ref=number;/去掉去掉去掉去掉=number,=number,编译器报错编译器报错编译器报错编译器报错coutrefendl;coutrefendl;return0;return0; 2024/8/520观察程序观察程序#include#includeusingnamespacestd;usingnamespacestd;intmain()intmain() intnum

24、ber=1;intnumber=1;int&int&ref=number;ref=number;constint&con_refconstint&con_ref=number;=number; cout+number=+numberendl;cout+number=+numberendl;cout+ref=+refendl;cout+ref=+refendl;cout+con_ref=cout+con_ref=+con_ref+con_refendl;endl;return0;return0; 2024/8/521指针指针 VS. 引用引用 什么时候用指针?什么时候用引用?什么时候用指针?什么

25、时候用引用?什么时候用指针?什么时候用引用?什么时候用指针?什么时候用引用?如果存在不指向任何对象的情况,应使用指针如果存在不指向任何对象的情况,应使用指针如果存在不指向任何对象的情况,应使用指针如果存在不指向任何对象的情况,应使用指针不能定义引用类型的数组,只能当以单个引用绑定不能定义引用类型的数组,只能当以单个引用绑定不能定义引用类型的数组,只能当以单个引用绑定不能定义引用类型的数组,只能当以单个引用绑定单个变量单个变量单个变量单个变量 引用比指针更安全引用比指针更安全引用比指针更安全引用比指针更安全2024/8/522voidsvoids&one,intone,int&another)a

26、nother) inttemp;inttemp; temp=one;temp=one;one=another;one=another;another=temp;another=temp; intmain()intmain() intone=3,another=5;intone=3,another=5; print(print(交换前交换前交换前交换前,one,another);,one,another);s,anothers,another); );print(print(交换后交换后交换后交换后,one,another);,one,another);return0;return0; 我需要更

27、通用的我需要更通用的swap实现!实现!voidswap(voidswap(intint&a,&a,intint&b)&b) intinttemp;temp;temp=a;temp=a;a=b;a=b;b=temp;b=temp; voidswap(voidswap(doubledouble&a,&a,doubledouble&b)&b) doubledoubletemp;temp;temp=a;temp=a;a=b;a=b;b=temp;b=temp; voidswap(voidswap(stringstring&a,&a,stringstring&b)&b) stringstringtem

28、p;temp;temp=a;temp=a;a=b;a=b;b=temp;b=temp; voidswap(voidswap(boolbool&a,&a,boolbool&b)&b) boolbooltemp;temp;temp=a;temp=a;a=b;a=b;b=temp;b=temp; 法语学习3C语法基础24intmain()intmain() inta=3,b=5;inta=3,b=5;charc=a,d=b;charc=a,d=b;doublee=3.1,f=1.1;doublee=3.1,f=1.1;coutbeforeswap,a=a,b=bendl;coutbeforeswap

29、,a=a,b=bendl;s);/s);s);/s);coutaftersa,b=bendl;coutaftersa,b=bendl;return0;return0; 2024/8/525 具有相似功能的具有相似功能的具有相似功能的具有相似功能的不同函数不同函数不同函数不同函数使用使用使用使用同一函数名同一函数名同一函数名同一函数名,但,但,但,但这些同名函数的这些同名函数的这些同名函数的这些同名函数的参数类型、参数个数、返回值参数类型、参数个数、返回值参数类型、参数个数、返回值参数类型、参数个数、返回值类型、函数功能类型、函数功能类型、函数功能类型、函数功能可以不同可以不同可以不同可以不同

30、编译系统根据编译系统根据编译系统根据编译系统根据参数的类型和个数参数的类型和个数参数的类型和个数参数的类型和个数来判断实际调来判断实际调来判断实际调来判断实际调用时该调用哪个函数用时该调用哪个函数用时该调用哪个函数用时该调用哪个函数 函数重载是函数重载是函数重载是函数重载是C+C+对多态性的一个体现对多态性的一个体现对多态性的一个体现对多态性的一个体现 如果只是函数返回值类型不同,无法让编译其如果只是函数返回值类型不同,无法让编译其如果只是函数返回值类型不同,无法让编译其如果只是函数返回值类型不同,无法让编译其确定调用哪个函数确定调用哪个函数确定调用哪个函数确定调用哪个函数什么是函数重载什么是

31、函数重载2024/8/5参数泛化的参数泛化的swap() / /如果把各种数据类型抽象为参数如果把各种数据类型抽象为参数如果把各种数据类型抽象为参数如果把各种数据类型抽象为参数TypeType / /并保证并保证并保证并保证swapswap能接受各种已定义类型的参数能接受各种已定义类型的参数能接受各种已定义类型的参数能接受各种已定义类型的参数voidswap(voidswap(TypeType&one,&one,TypeType&another)&another) TypeTypetemp;temp;temp=one;temp=one;one=another;one=another;anoth

32、er=temp;another=temp; / /泛化以后的泛化以后的泛化以后的泛化以后的swapswap具有更强的通用性具有更强的通用性具有更强的通用性具有更强的通用性intintstringstringcomplexcomplexcomplexcomplex 其他类其他类型型法语学习3C语法基础/ /这里的这里的这里的这里的TypeType也可换成其他你愿意的,如也可换成其他你愿意的,如也可换成其他你愿意的,如也可换成其他你愿意的,如templatetemplatevoidSwap(voidSwap(TypeType&one,&one,TypeType&another)/const&ano

33、ther)/const能否加上?能否加上?能否加上?能否加上? Typetemp;Typetemp;temp=one;temp=one;one=another;one=another;another=temp;another=temp; templatetemplatevoidprint(stringhint,Type&one,Type&another)voidprint(stringhint,Type&one,Type&another) couthint,one=onecouthint,one=one,another=anotherendl;,another=anotherendl; 法语学

34、习3C语法基础intmain()intmain() inta1=5;inta1=5;inta2=3;inta2=3;print(beforeswap,a1,a2);print(beforeswap,a1,a2);S);/intS);/int类型函数调用类型函数调用类型函数调用类型函数调用print(afterswap,a1,a2);print(afterswap,a1,a2);strings1=C+;strings1=C+;strings2=Java;strings2=Java;print(nbeforeswap,s1,s2);print(nbeforeswap,s1,s2);S);/stri

35、ngS);/string类型函数调用类型函数调用类型函数调用类型函数调用print(afterswap,s1,s2);print(afterswap,s1,s2);return0;return0; 法语学习3C语法基础动态跟踪程序执行过程动态跟踪程序执行过程法语学习3C语法基础 模板使用参数化的模板使用参数化的模板使用参数化的模板使用参数化的C+C+类型创建相应的函数和类型创建相应的函数和类型创建相应的函数和类型创建相应的函数和类,是更高一级的抽象。类,是更高一级的抽象。类,是更高一级的抽象。类,是更高一级的抽象。 模板分为函数模板和类模板模板分为函数模板和类模板模板分为函数模板和类模板模板分

36、为函数模板和类模板 一个模板并非实实在在的类或函数,是参数化一个模板并非实实在在的类或函数,是参数化一个模板并非实实在在的类或函数,是参数化一个模板并非实实在在的类或函数,是参数化的类和函数的类和函数的类和函数的类和函数 函数模板的定义格式:函数模板的定义格式:函数模板的定义格式:函数模板的定义格式:templatetemplateclassclass或或或或typenametypename () 模板模板法语学习3C语法基础关于函数模板关于函数模板 参数化的函数称为函数模板,代表的是一个函数参数化的函数称为函数模板,代表的是一个函数参数化的函数称为函数模板,代表的是一个函数参数化的函数称为函

37、数模板,代表的是一个函数家族家族家族家族 函数模板不是一个实实在在的函数。函数模板不是一个实实在在的函数。函数模板不是一个实实在在的函数。函数模板不是一个实实在在的函数。编译系统不编译系统不编译系统不编译系统不为其产生任何执行代码为其产生任何执行代码为其产生任何执行代码为其产生任何执行代码。只有当编译器发现一个。只有当编译器发现一个。只有当编译器发现一个。只有当编译器发现一个具体的函数调用时,才根据具体的参数类型产生具体的函数调用时,才根据具体的参数类型产生具体的函数调用时,才根据具体的参数类型产生具体的函数调用时,才根据具体的参数类型产生相应的代码,相应的代码,相应的代码,相应的代码,这部分

38、代码称为模板函数这部分代码称为模板函数这部分代码称为模板函数这部分代码称为模板函数。它是函。它是函。它是函。它是函数模板的一个具体实例,只处理唯一的一种数据数模板的一个具体实例,只处理唯一的一种数据数模板的一个具体实例,只处理唯一的一种数据数模板的一个具体实例,只处理唯一的一种数据类型。类型。类型。类型。 模板函数的生成模板函数的生成模板函数的生成模板函数的生成由编译系统隐式生成由编译系统隐式生成由编译系统隐式生成由编译系统隐式生成,其实质是其实质是其实质是其实质是函数重载函数重载函数重载函数重载法语学习3C语法基础32C+的类型转换的类型转换 运算符运算符 应尽量避免类型转换应尽量避免类型转

39、换应尽量避免类型转换应尽量避免类型转换(dynamic_cast(dynamic_cast除外除外除外除外) )使用类型转换常常引起类型错误或者数值截断使用类型转换常常引起类型错误或者数值截断使用类型转换常常引起类型错误或者数值截断使用类型转换常常引起类型错误或者数值截断C C风格的类型转换在程序中难以发现风格的类型转换在程序中难以发现风格的类型转换在程序中难以发现风格的类型转换在程序中难以发现 类型转换潜在着极其高的破坏性类型转换潜在着极其高的破坏性类型转换潜在着极其高的破坏性类型转换潜在着极其高的破坏性 丑陋的操作应该使用丑陋的语法形式丑陋的操作应该使用丑陋的语法形式丑陋的操作应该使用丑陋

40、的语法形式丑陋的操作应该使用丑陋的语法形式 static_caststatic_cast:比:比:比:比C C的强制类型转换符更安全的类的强制类型转换符更安全的类的强制类型转换符更安全的类的强制类型转换符更安全的类型转换型转换型转换型转换用法:用法:用法:用法:static_cast(expression)static_cast(expression)static_caststatic_cast将表达式的结果类型转换为将表达式的结果类型转换为将表达式的结果类型转换为将表达式的结果类型转换为new_typenew_type类型类型类型类型2024/8/533static_cast示例示例#inc

41、lude#includeusingnamespacestd;usingnamespacestd;intmain()intmain() inta=10;inta=10;/ /编译通过,但编译通过,但编译通过,但编译通过,但p1p1所指并非所指并非所指并非所指并非doubledouble对象对象对象对象double*p1=(double*)&a;double*p1=(double*)&a;/编译器阻止将编译器阻止将编译器阻止将编译器阻止将int*int*转换为转换为转换为转换为double*double*double*p2=double*p2=static_cast(&a);static_cast

42、(&a);/ /确实想将确实想将确实想将确实想将int*int*转换为转换为转换为转换为double*double*double*p3=double*p3=reinterpret_cast(&a);reinterpret_cast(&a);return0;return0; 34 reinterpret_castreinterpret_cast:按:按:按:按bitbit重新解释类型重新解释类型重新解释类型重新解释类型用法:用法:用法:用法:reinterpret_cast(expression)reinterpret_cast(expression)该运算符只能在指针之间转换该运算符只能在指针

43、之间转换该运算符只能在指针之间转换该运算符只能在指针之间转换 例例例例#include#includeusingnamespacestd;usingnamespacestd;intmain()intmain() intn=9;intn=9;doubled=reinterpret_cast(n);doubled=reinterpret_cast(n);coutreinterpret_cast:d=dendl;coutreinterpret_cast:d=dendl;d=static_cast(n);d=static_cast(n);coutstatic_cast:d=dendl;coutstat

44、ic_cast:d=dendl;return0;return0; 35static_cast和和reinterpret_cast 二者均修改了操作数类型。二者均修改了操作数类型。二者均修改了操作数类型。二者均修改了操作数类型。但它们不是互逆的但它们不是互逆的但它们不是互逆的但它们不是互逆的 reinterpret_castreinterpret_cast仅仅是重新解释了对象的比特模仅仅是重新解释了对象的比特模仅仅是重新解释了对象的比特模仅仅是重新解释了对象的比特模型而没有进行二进制转换型而没有进行二进制转换型而没有进行二进制转换型而没有进行二进制转换intnum=10,*pointer=&nu

45、m;intnum=10,*pointer=#double*ptr=reinterpret_cast(pointer);double*ptr=reinterpret_cast(pointer);这里仅仅复制了这里仅仅复制了这里仅仅复制了这里仅仅复制了pointerpointer内的内的内的内的bitbit位到位到位到位到ptrptr中,没有做类型中,没有做类型中,没有做类型中,没有做类型检查和对应的二进制转换,得到的检查和对应的二进制转换,得到的检查和对应的二进制转换,得到的检查和对应的二进制转换,得到的ptrptr是无用值是无用值是无用值是无用值 static_caststatic_c

46、ast在编译时使用类型信息执行转换,在在编译时使用类型信息执行转换,在在编译时使用类型信息执行转换,在在编译时使用类型信息执行转换,在转换执行必要的检测转换执行必要的检测转换执行必要的检测转换执行必要的检测( (诸如指针越界计算诸如指针越界计算诸如指针越界计算诸如指针越界计算, ,类型检类型检类型检类型检查查查查) )。其操作数相对是安全的。其操作数相对是安全的。其操作数相对是安全的。其操作数相对是安全的。intn=9;intn=9;doubled=static_cast(n);doubled=static_cast(n);int int 类型和类型和类型和类型和doubledouble类型的

47、二进制表达是不同的类型的二进制表达是不同的类型的二进制表达是不同的类型的二进制表达是不同的将整数将整数将整数将整数 9 9 转换到转换到转换到转换到 双精度整数双精度整数双精度整数双精度整数 9 9,static_cast static_cast 需要正确需要正确需要正确需要正确地为双精度整数地为双精度整数地为双精度整数地为双精度整数 d d 补足比特位补足比特位补足比特位补足比特位2024/8/536const_cast运算符运算符 const_castconst_cast用于用于用于用于在编译时在编译时在编译时在编译时移除变量的移除变量的移除变量的移除变量的constconst限定符限定符

48、限定符限定符用法用法用法用法:const_cast(expression):const_cast(expression)#include#includeusingnamespacestd;usingnamespacestd;intmain()intmain() constintc=7;constintc=7;int*q1=&c;/errorint*q1=&c;/errorint*q2=(int*)&c;/okint*q2=(int*)&c;/ok(但(但(但(但* *q2=2;q2=2;是未定义的行为)是未定义的行为)是未定义的行为)是未定义的行为)int*q3=static_cast(&ci

49、nt*q3=static_cast(&c); );/错错错错, ,不能去除不能去除不能去除不能去除constconst性质性质性质性质int*q4=const_cast(&c);/int*q4=const_cast(&c);/去除去除去除去除constconst性质性质性质性质return0;return0; 37何时用到何时用到const_cast#include#includeusingnamespacestd;usingnamespacestd;voidf(int*p)voidf(int*p) cout*pendl;cout*pendl; intmain(void)intmain(voi

50、d) constinta=10;constinta=10;constint*b=&a;constint*b=&a;/Functionf()expectsint*,notconstint*/Functionf()expectsint*,notconstint*/f(b);/f(b);int*c=const_cast(b);int*c=const_cast(b);f(c);f(c); 2024/8/538/Lvalueisconst/Lvalueisconst/*b=20;/*b=20;/Undefinedbehavior/Undefinedbehavior/*c=30;/*c=30;inta1=

51、40;inta1=40;constint*b1=&a1;constint*b1=&a1;int*c1=const_cast(b1);int*c1=const_cast(b1);/Integera1,theobjectreferredtobyc1,has/Integera1,theobjectreferredtobyc1,has/notbeendeclaredconst/notbeendeclaredconst*c1=50;*c1=50;return0;return0; /reinterpret_cast/reinterpret_cast应用见我提供文档应用见我提供文档应用见我提供文档应用见我提

52、供文档:reinterpret_cast:reinterpret_cast辅助辅助辅助辅助hashhash函数函数函数函数39作业作业读程序读程序 读后面两个程序,再独立写出这两个程序,如读后面两个程序,再独立写出这两个程序,如读后面两个程序,再独立写出这两个程序,如读后面两个程序,再独立写出这两个程序,如果有写不下去或者错误的地方,代表这是你理果有写不下去或者错误的地方,代表这是你理果有写不下去或者错误的地方,代表这是你理果有写不下去或者错误的地方,代表这是你理解上的盲点,要多注意解上的盲点,要多注意解上的盲点,要多注意解上的盲点,要多注意 请注意看第一个程序中字符串的相关操作,如请注意看第

53、一个程序中字符串的相关操作,如请注意看第一个程序中字符串的相关操作,如请注意看第一个程序中字符串的相关操作,如字符串连接等如何实现字符串连接等如何实现字符串连接等如何实现字符串连接等如何实现 请注意两个程序中的请注意两个程序中的请注意两个程序中的请注意两个程序中的srand()srand()函数,如果去掉这函数,如果去掉这函数,如果去掉这函数,如果去掉这个函数,程序执行结果如何?请说明个函数,程序执行结果如何?请说明个函数,程序执行结果如何?请说明个函数,程序执行结果如何?请说明srand()srand()的的的的作用作用作用作用2024/8/540随机生成一个英文的小写字符集随机生成一个英文

54、的小写字符集 怎样让计算机随机生成怎样让计算机随机生成怎样让计算机随机生成怎样让计算机随机生成1 1个小写英文字母?个小写英文字母?个小写英文字母?个小写英文字母? 随机函数随机函数随机函数随机函数rand()rand() 产生产生产生产生0,RAND_MAX0,RAND_MAX的随机整数的随机整数的随机整数的随机整数magic=rand();magic=rand(); #include#includeRAND_MAXRAND_MAX在在在在中定义,中定义,中定义,中定义,不大于双字节整数不大于双字节整数不大于双字节整数不大于双字节整数的最大值的最大值的最大值的最大值32767 32767 产

55、生产生产生产生0,b-10,b-1的随机整数的随机整数的随机整数的随机整数magic=rand()%b;magic=rand()%b; 产生产生产生产生a,a+b-1a,a+b-1的随机整数的随机整数的随机整数的随机整数magic=rand()%b+a;magic=rand()%b+a; 产生产生产生产生a,za,z的随机字符的随机字符的随机字符的随机字符char randomChar = a + rand() % 26 ;char randomChar = a + rand() % 26 ;41思路思路 定义定义定义定义stringstring类型对象类型对象类型对象类型对象charSetc

56、harSet,用于存储随机生成,用于存储随机生成,用于存储随机生成,用于存储随机生成的字符集的字符集的字符集的字符集 通过循环随机生成若干字符通过循环随机生成若干字符通过循环随机生成若干字符通过循环随机生成若干字符随机产生随机产生随机产生随机产生a,za,z的一个字符的一个字符的一个字符的一个字符将该字符连接到将该字符连接到将该字符连接到将该字符连接到charSetcharSet尾部尾部尾部尾部 charSet+=randomChar/stringcharSet+=randomChar/string通过通过通过通过+=+=运算符连接字符串运算符连接字符串运算符连接字符串运算符连接字符串 输出随

57、机字符集输出随机字符集输出随机字符集输出随机字符集2024/8/542#include#include#include#include#include#include#include#includeusingnamespacestd;usingnamespacestd;intmain()intmain() stringcharSet;stringcharSet;/ /定义定义定义定义空字符串空字符串空字符串空字符串charSetcharSetinttimes=100;inttimes=100;intmagic,i;intmagic,i;charrandomChar;charrandomChar

58、; 2024/8/543srand(time(NULL);srand(time(NULL);/ /设置随机种子,否则随机数是伪随机设置随机种子,否则随机数是伪随机设置随机种子,否则随机数是伪随机设置随机种子,否则随机数是伪随机for(i=1;i=times;i+)for(i=1;i=times;i+) magic=rand()%26;magic=rand()%26;randomChar=a+magic;randomChar=a+magic;charSetcharSet+=+=randomChar;randomChar; coutrandomcharset:ncharSetendl;coutra

59、ndomcharset:ncharSetendl;return0;return0; 2024/8/544模拟硬币的模拟硬币的100次投掷次投掷#include#include#include#include#include#include#defineTIMES100#defineTIMES100usingnamespacestd;usingnamespacestd;intCoinTossing()intCoinTossing() intmagic=rand()%2;intmagic=rand()%2;magic?coutHeads.:coutTails.;magic?coutHeads.:c

60、outTails.;coutt;coutt;returnmagic;returnmagic; 2024/8/545intmain()intmain() inti,magic;inti,magic;intheads=0,tails=0;intheads=0,tails=0;srand(time(NULL);srand(time(NULL);coutcout开始投掷:开始投掷:开始投掷:开始投掷:endl;endl;cout-endl;cout-endl;for(i=1;i=TIMES;i+)for(i=1;i=TIMES;i+) magic=magic=CoinTossing();CoinTos

61、sing();if(i%5=0)if(i%5=0)coutendl;coutendl;magic?heads+:tails+;magic?heads+:tails+; cout-endl;cout-endl;coutcout共投掷共投掷共投掷共投掷TIMESTIMES次,其中正面次,其中正面次,其中正面次,其中正面headsheads次,背面次,背面次,背面次,背面tailstails次。次。次。次。endl;endl;return0;return0; / /在循环中频繁调用函数在循环中频繁调用函数在循环中频繁调用函数在循环中频繁调用函数CoinTossingCoinTossing,存在时间和

62、空间上的开销,存在时间和空间上的开销,存在时间和空间上的开销,存在时间和空间上的开销2024/8/546作业作业写程序写程序 设计函数设计函数设计函数设计函数minmin,返回,返回,返回,返回intint类型的两数中小者,重类型的两数中小者,重类型的两数中小者,重类型的两数中小者,重载函数载函数载函数载函数minmin,使之适用于,使之适用于,使之适用于,使之适用于doubledouble、charchar、boolbool 设计泛型函数设计泛型函数设计泛型函数设计泛型函数minmin,返回同类型两数中的小者,返回同类型两数中的小者,返回同类型两数中的小者,返回同类型两数中的小者2024/8/5

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号