[法语学习]3C++语法基础.ppt_第1页
[法语学习]3C++语法基础.ppt_第2页
[法语学习]3C++语法基础.ppt_第3页
[法语学习]3C++语法基础.ppt_第4页
[法语学习]3C++语法基础.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+语法基础,重庆邮电大学计算机科学与技术学院 冯 潇 ,2019/4/19,回顾,#include #include using namespace std; /使用标准名字空间std int main() string name; /C+标准库提供的字符串类string cout name; cout “Hello, “ name “, welcome to C+ world!“ endl; return 0; ,2019/4/19,说明: VC+中整型数据占4B,字符型占1B,float型占4B,double型占8B,指针占4B,2019/4/19,本次课内容,内联函数、带默认值的函数 理解并正确运用引用、函数重载 初步理解函数模板 C+中的四种类型转换 运算符 static_cast、const_cast、reinterpret_cast dynamic_cast,说明程序运行结果,#include using namespace std; int boxVolume( int length = 1, int width = 1, int height = 1 ); int main() cout “The default box volume is: “ boxVolume(); cout “nnThe volume of a box with length 10,n“ “width 1 and height 1 is: “ boxVolume(10); cout “nnThe volume of a box with length 10,n“ “width 5 and height 1 is: “ boxVolume(10,5); cout “nnThe volume of a box with length 10,n“ “width 5 and height 2 is: “ boxVolume(10,5,2) endl; return 0; int boxVolume( int length, int width, int height ) return length * width * height; ,2019/4/19,说明,默认参数一般在函数声明中提供 默认参数必须放在参数表的最后 默认参数的声明必须出现在函数调用之前,内联函数,#include using namespace std; /inline限定boxVolume函数为内联函数 inline void boxVolume( int length = 1, int width = 1, int height = 1 ) int vol; vol = length * width * height; int main() boxVolume(); boxVolume(10); boxVolume(10,5); boxVolume(10,5,2); return 0; ,编译器秘密将函数调用语句boxVolume(),根据参数替换为length * width * height,内联函数-以空间换取时间,函数调用存在时间上的代价 保存调用点地址,开辟、销毁栈,返回调用点 内联函数是一种以空间效率换取时间效率的机制 把函数代码的多份副本插入程序中(通常会使程序变长、体积变大) 内联函数的显式定义格式为: inline () ,2019/4/19,几点说明,内联函数一般只有15条语句的函数 内联函数体内不能有复杂的控制语句(swith、while、for等等)(对部分表示怀疑) 递归函数不能定义为内联函数 内联函数只能先定义后使用,VC6中设置内联函数展开 ALT+F7,2019/4/19,未限定inline的boxVolume调用,反汇编程序代码,在VC下可以看到: 函数的参数按照从右到左的顺序压栈 指令call发起函数boxVolume()的调用,2019/4/19,限定inline的boxVolume调用,从反汇编结果可以看出: 主函数中的函数调用均被换成了函数体内的乘法运算,2019/4/19,inline限定符只是程序员对编译器的建议,而非强制性的 inline限定符应该只适用于小的、经常使用的函数 使用内联函数可以减少程序执行时间,但是会增加程序长度 为了调试方便,在程序处于调试阶段时,所有内联函数都不被实现 编译器可以忽略inline限定符,并且对于除了小函数以外的函数,通常会这样做,2019/4/19,从很熟悉的问题谈起,#include using namespace std; void swap(int *p1, int *p2) int temp; temp = *p1; *p1 = *p2; *p2 = temp; int main() int x1 = 3, x2 = 5; cout “before swap, x1 = “ x1 “, x2 = “ x2 endl; swap( ,对比 前一程序,#include #include using namespace std; void swap(int *one, int *another) int temp; temp = *one; *one = *another; *another = temp; void print(string hint, int one, int another) cout hint “, one = “ one “, another = “ another endl; ,对比前一程序,int main() int one = 3, another = 5; print(“交换前“, one , another ); swap( /前后两个程序哪个更好,为什么?,2019/4/19,说明,标识符的命名应做到名副其实,以数字系列命名(x1、x2,.xN),则完全没有提供正确信息或不能体现作者意图 函数名应当是动词或动词短语,如deleteNode、save 代码之间应减少重复和依赖 多次重复出现的代码段应想办法将其模块化为函数 最小权限原则 整洁代码的编写虽然也遵循很多规范,但也有较强主观性,需要多加练习才能掌握大量的实用技巧并积累出优化代码和程序结构的经验,2019/4/19,引用(reference),C+引入“引用”的目的 指针存在着相当大的安全隐患 引用,即变量的别名 引用的声明格式 类型 声明引用时,必须对其进行初始化,2019/4/19,观察程序,#include using namespace std; int main() int number = 1; int *pointer; /指针未初始化,编译器不报错 int ,2019/4/19,观察程序,#include using namespace std; int main() int number = 1; int ,2019/4/19,指针 VS. 引用,什么时候用指针?什么时候用引用? 如果存在不指向任何对象的情况,应使用指针 不能定义引用类型的数组,只能当以单个引用绑定单个变量 引用比指针更安全, void swap(int ,我需要更通用的swap实现!,void swap(int ,void swap(string ,2019/4/19,int main() int a = 3, b = 5; char c = a, d = b; double e = 3.1,f = 1.1; cout “before swap,a= “ a “ , b = “ b endl; swap(a,b);/swap(c,d); cout “after swap,a= “ a “ , b = “ b endl; return 0; ,2019/4/19,具有相似功能的不同函数使用同一函数名,但这些同名函数的参数类型、参数个数、返回值类型、函数功能可以不同 编译系统根据参数的类型和个数来判断实际调用时该调用哪个函数 函数重载是C+对多态性的一个体现 如果只是函数返回值类型不同,无法让编译其确定调用哪个函数,什么是函数重载,参数泛化的swap(),/如果把各种数据类型抽象为参数Type /并保证swap能接受各种已定义类型的参数 void swap(Type /泛化以后的swap具有更强的通用性,int,string,complex,complex,其他类型,/这里的Type也可换成其他你愿意的,如 template void Swap(Type ,int main() int a1 = 5; int a2 = 3; print(“before swap“, a1, a2); Swap(a1,a2);/int类型函数调用 print(“after swap“, a1, a2); string s1 = “C+“; string s2 = “Java“; print(“nbefore swap“, s1, s2); Swap(s1,s2); /string类型函数调用 print(“after swap“, s1, s2); return 0; ,动态跟踪程序执行过程,模板使用参数化的C+类型创建相应的函数和类,是更高一级的抽象。 模板分为函数模板和类模板 一个模板并非实实在在的类或函数,是参数化的类和函数 函数模板的定义格式: template () ,模板,关于函数模板,参数化的函数称为函数模板,代表的是一个函数家族 函数模板不是一个实实在在的函数。编译系统不为其产生任何执行代码。只有当编译器发现一个具体的函数调用时,才根据具体的参数类型产生相应的代码,这部分代码称为模板函数。它是函数模板的一个具体实例,只处理唯一的一种数据类型。 模板函数的生成由编译系统隐式生成,其实质是函数重载,C+的类型转换 运算符,应尽量避免类型转换(dynamic_cast除外) 使用类型转换常常引起类型错误或者数值截断 C风格的类型转换在程序中难以发现 类型转换潜在着极其高的破坏性 丑陋的操作应该使用丑陋的语法形式 static_cast:比C的强制类型转换符更安全的类型转换 用法:static_cast (expression) static_cast将表达式的结果类型转换为new_type类型,2019/4/19,static_cast 示例,#include using namespace std; int main() int a = 10; /编译通过,但p1所指并非double对象 double *p1 = (double *) ,reinterpret_cast:按bit重新解释类型 用法:reinterpret_cast (expression) 该运算符只能在指针之间转换 例 #include using namespace std; int main() int n = 9; double d = reinterpret_cast (n); cout (n); cout “static_cast : d = “ d endl; return 0; ,static_cast和reinterpret_cast,二者均修改了操作数类型。但它们不是互逆的 reinterpret_cast 仅仅是重新解释了对象的比特模型而没有进行二进制转换 int num = 10, *pointer = int 类型和double类型的二进制表达是不同的 将整数 9 转换到 双精度整数 9,static_cast 需要正确地为双精度整数 d 补足比特位,2019/4/19,const_cast运算符,const_cast用于在编译时移除变量的const限定符 用法:const _cast (expression) #include using namespace std; int main() const int c = 7; int* q1 = ,何时用到 const_cast,#include using namespace std; void f(int *p) cout (b); f(c);,2019/4/19,/ Lvalue is const / *b = 20; / Undefined behavior / *c = 30; int a1 = 40; const int *b1 = /reinterpret_cast应用见我提供文档:reinterpret_cast辅助hash函数,作业读程序,读后面两个程序,再独立写出这两个程序,如果有写不下去或者错误的地方,代表这是你理解上的盲点,要多注意 请注意看第一个程序中字符串的相关操作,如字符串连接等如何实现 请注意两个程序中的srand()函数,如果去掉这个函数,程序执行结果如何?请说明srand()的作用,2019/4/19,随机生成一个英文的小写字符集,怎样让计算机随机生成1个小写英文字母? 随机函数rand() 产生0,RAND_MAX 的随机整数 magic = rand(); #include RAND_MAX在中定义,不大于双字节整数的最大值32767 产生0,b-1 的随机整数 magic = rand() % b; 产生a,a+b-1 的随机整数 magic = rand() % b + a; 产生a, z的随机字符 char randomChar = a + rand() % 26 ;,思路,定义string类型对象charSet,用于存储随机生成的字符集 通过循环随机生成若干字符 随机产生a, z的一个字符 将该字符连接到charSet尾部 charSet += randomChar /string通过+=运算符连接字符串 输出随机字符集,2019/4/19,#include #include #include #include using namespace std; int main() string charSet; /定义空字符串charSet int times = 100; int magic, i; char randomChar;,2019/4/19,srand(time(NULL); /设置随机种子,否则随机数是伪随机 for(i = 1; i = times; i+) magic = rand() % 26; randomChar = a + magic; charSet += randomChar

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论