




已阅读5页,还剩45页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2.从C到C+,2.1 C+关键字,C中容许出现的字符: 26个大写字母 26个小写字母 10个数字 其他符号:空格 + - * / = , . _ : ; ? “ | ! # % & ( ) ,C+标识符的命名规则,标识由英文字母、数字和下划线符号“_”构成,长度不限。 英文字母区分大小写。 标识不可以数字开头。 不可以使用C+内设的关键字(keywords)。,C+的常用关键字及其分类,2.2 const 常量,符号常量:用一个标识符代表的常量,即:在程序中用define 命令定义某个符号所代表的常量。 例如:#define W ”女” #define M ”男” #define PRICE 123.789 注意: 1.一旦定义了某个符号代表一个常量,则该符号在其作用域内就表示这个常量 2.符号常量不是变量,在其作用域内不能被赋值 3.为提高程序的可读性,符号常量一般用大写表示,const常量:冻结变量,例:const double pi = 3.14159265; pi的不能作为lval,pi的值不能被改变 C中使用const常量而不提倡用符号常量。 原因:符号常量只是简单的替代并不做类型检查,有可能产生类型不匹配的问题。,const 定义,const定义常量格式如下: const = 或: const = 例如,前面提到的声明: const double PI = 3.14; const int bufSize = 512; 或:int const bufSize = 512; 数组常量的定义格式如下: const = ; 或: const = ; 例如: int const I_ARAAY3 = 1,2,3; const char NAME4 = J,A,C,K;,2.3 函数,2.3.1 内联函数(inline函数) 2.3.2 重载函数 2.3.3 函数参数的默认值 2.3.4 函数模板,2.3.1 内联函数(inline函数),1 常规的函数调用 时间开销 空间开销,#include using namespace std; double caclArea(int r); /函数声明 int main() caclArea(1); caclArea(3); caclArea(5); return 0; double caclArea(int r) return 3.1416*r*r; ,2 内联函数的执行 程序无需跳转 对内联函数而言,在程序编译期间,编译器将使用内联函数的函数体直接替换函数调用。因此,内联函数的运行速度比常规函数稍快。 需要占用更多的空间 如果程序在10个不同的地方调用了同一个内联函数,则程序将包含该函数的10个代码拷贝,因此如果函数代码长度过大,超出了跳转语句所占空间的长度,就会增加整个程序的代码量,使程序运行的空间开销大大增加了 内联的实质 用空间来换取时间空间开销增大了,时间开销却减少了,从而提高了程序的执行效率。,3 内联函数的定义,在函数声明前加上关键字inline。 在函数定义前加上关键字inline。 如: inline double caclArea(int r); inline double caclArea(int r) return 3.1416*r*r; 注:在函数定义处可用inline 关键字说明函数为内联函数。如果函数定义在函数调用之后,则必须在函数声明处就包括inline,否则就作为一般的函数处理。,例2-1 内联被当作一般函数处理,#include using namespace std; double dCaclArea(double dr); /函数声明,此处无inline int main() int i = 5 ; double dCirlcle; for(i = 1;i=5;i+) dCirlcle = dCaclArea(i); /实际没有内联,仍然调用 cout dCirlcle “;“; coutendl; getchar(); return 0; inline double dCaclArea (double dr)/此处为内联 return 3.1416*dr*dr; ,4 用内联函数替代宏,#define SQUARE(X) X*X 这并不是通过传递参数实现的,而是通过文本替换来实现的,看下面的几个语句: (1)a = SQUARE(4) ; (2)a = SQUARE(4+5); (3)int b = 2;a = SQUARE(b+); (4)a = SQUARE(”hello”);,inline double SQUARE(double x) return x*x; ,5 内联函数的限制,(1)内联函数中通常不包括复杂结构控制语句,如switch、while语句、复杂语句嵌套,否则,系统将作为一般函数处理。 (2)递归函数不能被作为内联函数。 (3)内联函数只适合于只有15行的小函数。 (4)在类结构中,在类体内定义的函数成员都是内联函数。,2.3.2 重载函数,1.重载函数引入的原因 int iMax(int,int ); float fMax(float,float ); double dMax(double,double );,希望是,int Max(int,int ); float Max(float,float ); double Max(double,double );,2重载函数的匹配,在函数同名的情况下,编译器是根据函数的参数列表。它是函数重载的关键。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,如果参数列表相同仅有函数返回值类型不同,是不能够重载的。 下面的几个重载函数就具有不同参数列表: int add(int a, int b); double add(double a,double b); float add(folat a, folat b),重载函数的匹配,当某个函数中调用重载函数时,编译器会根据实参类型调用相应的函数。匹配的过程按如下步骤进行: 如果有严格的匹配的函数,就调用该函数。 参数内部转换后如果匹配,则调用该函数。 通过用户定义的转换寻求匹配。 例如,如下两个重载函数: void fun(int); void fun(doulbe); 对于下列调用函数fun()匹配情况如下: fun(2); /匹配void fun (int),严格匹配 fun(2.5); /匹配void fun(double),严格匹配 fun(a); /匹配void fun (int),内部转换后匹配 fun(doulbe)6) /匹配void fun(double),强制类型转换后匹配。,void fun(long); void fun(doulbe); int main() int i = 5; fun(i); ,使用重载函数时的注意事项:,(1)不能使用类型定义typedef语句定义的类型名来区分重载函数中声明的参数。例如,下面的函数重载是不正确的。 typedef int INT; void fun(int); void fun(INT)/错误!函数重复定义 (2)重载函数应当具有相同或类似的功能,如果让同名函数执行不同的功能,则程序的可读性受到破坏,这不是一个良好的编程风格。,3.重载函数应用举例,例2-2 求两个操作数之和。 #include using namespace std; int add(int,int); double add(double,double); int main( ) coutadd(5,10)endl; coutadd(5.0,10.5)endl; getchar(); return 0; int add(int x,int y) return x+y; double add(double a,double b) return a+b; ,程序的输出结果为: 15 155,例2-3 找出几个int型中的最小值,#include using namespace std; int min(int a,int b); int min(int a,int b,int c); int min(int a,int b,int c,int d); int main( ) cout min(13,5,4,2)endl; cout min(13,5,4)endl; cout min(13,5)endl; getchar(); return 0; ,程序的输出结果为: 2 4 5,int min(int a,int b) return ab?a:b; int min(int a,int b,int c) int t = min(a,b); return min(t,c); int min(int a,int b,int c,int d) int t1 = min(a,b,c); return min(t1,d); ,2.3.3 函数参数的默认值,默认参数指的是当函数调用中省略了实参时,自动使用的一个值。如何设置默认值呢?必须通过函数的原型。由于编译器是通过检查原型来了解函数所使用的参数数目,因此函数原型必须将可能的默认参数告知程序。方法是将值赋给原型中的参数。如: int funtion(int n,int m = 4); 函数默认参数声明的语法格式如下: 返回值类型 函数名(形参1,形参n-1 = 默认值,形参n = 默认值),注意事项,(1)带有默认值的参数在调用时,对于默认参数,可以给出实参值,也可以不给出实参值。如果给出,则将实参传递给形参,否则,将按照形参调用。,例2-4 带默认参数值的函数,#include using namespace std; void fun(int a=1,int b=2,int c=3) cout“a=“a,“b=“b, “c=“cendl; int main( ) fun( ); fun(9); fun(4,5); fun(7,8,9); return 0; ,程序的输出结果为: a=1,b=2,c=3 a=9,b=2,c=3 a=4,b=5,c=3 a=7,b=8,c=9,(2)默认参数并不一定是常量,它可以是任意的表达式,甚至可以通过函数调用给出。如果默认参数是表达式,则函数每次调用时,该表达式将被重新求值。默认值一般是全局变量,而不是局部变量,因为默认参数的调用是在编译时去确定的,而局部变量编译时无法确定。,例2-5 带默认参数值的函数,#include using namespace std; int q(5),p(7); int sum_int(int a,int b=p+q,int c=q*p); int main( ) int x(5),y(10); int s1=sum_int(x); int s2=sum_int(x,y); cout“s1=“s1n“s2=“s2endl; return 0; ,int sum_int(int a,int b,int c) return a+b+c; ,程序的输出结果为: s1=52 s1=50,(3)对于带参数列表的函数,必须从右向左添加默认值。也就是说,要为某个参数设置默认值,则必须为它右边的所有参数提供默认值,下面的函数原型说明中,有些是不正确的。 int fun(int m,int n = 3,int j = 5); int fun(int m,int n = 3,int j ); int fun(int m = 1,int n = 3,int j = 5 );,在调用函数时,实参按照从左到右的顺序依次被赋值给相应的形参,而不能跳过任何参数,因此,下面的函数调用中,有些也是不允许的。 int results; results = fun(1); results = fun(1,8) results = fun(1,7,8) results = fun(1,8);,(4)注意带有默认参数的重载函数所引起的二义性。二义性问题实际上就是编译器不能确定该语句究竟是什么意思,可以作出多种解释。函数重载时,尤其在有默认参数的情况下,很容易引发二义性的问题。 int fun(int m,int n,int j = 5); int fun(int m,int n = 3,int j=5 ); int fun(int m = 1,int n = 3,int j = 5 ); fun(1,5),2.3.4 函数模板,1 为什么要使用函数模板? int add(int a, int b) return a+b; float add(float a, float b) return a+b; ,希望,T add(T a, T b) return a+b; ,2 函数模板及其定义,函数模板的一般定义格式如下: template (形式参数表) /函数体 ,注:模板类型参数代表一种类型,用关键字typename或 class后加一个标识符构成,在这里,两个关键字的意义相同,它们表示后面的参数名代表一个潜在的内置或用户定义的类型。,示例,template void Swap(AnyType ,3 实例化函数模板,所谓实例化函数模板,就是编辑器根据函数调用时具体的参数类型,按照模板样式,创建具体函数的过程。 在编译过程中,当编译器发现有一个函数调用()时,它将根据中的具体类型实参生成一个重载函数即模板函数。该模板函数的定义体与函数模板的定义体相同,而类型则以类型来代替。,例2-6 交换两个数的函数模版,#include /函数模板原型 template / 或者是 tempplate void Swap(AnyType ,/函数模板定义 template/ 或者是tempplate void Swap(AnyType ,4 函数模板与模板函数,函数模板与模板函数的主要区别在于: (1)函数模板不是一个函数,而是对一组函数的描述,是一组函数的模板,在定义时使用了参数化类型。 (2)模板函数是一种实实在在的函数定义,它的函数体与某个函数模板的函数体相同,编译器遇到模板函数调用时,将生成可执行代码。,5 重载函数模板,函数模板与普通函数一样,也可以重载。这里包含两种含义,第一种
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 弹性网络架构的应用场景试题及答案
- 2025届广东省阳江地区八下数学期末监测试题含解析
- 2025年软考网络管理员能力要求试题及答案
- 广东省汕头市苏湾中学2025届七下数学期末联考试题含解析
- 风险识别在日常管理中的应用试题及答案
- 企业治理与风险预警机制试题及答案
- 四川省内江市隆昌市隆昌市第三中学2025届八下数学期末经典试题含解析
- 2025届浙江省宁波市宁波华茂国际学校数学八下期末质量检测模拟试题含解析
- 2025年软考软件设计师真题及答案分析
- 网络安全文化建设的必要性试题及答案
- 乡村振兴战略相关试题及答案
- 粉笔线上协议班合同
- 护士分层级培训及管理
- 2025-2030中国体声波滤波器行业市场发展趋势与前景展望战略研究报告
- 急诊护理团队精神
- 世界环境日主题班会《生物多样性保护》班会课件
- 智联网汽车技术 课件 13.9自动紧急制动系统
- 危废转运合同范例
- DBJT13-323-2019 土壤固化剂应用技术规程
- 手术患者管路安全管理
- 数字化转型下的对公客户业务场景解析
评论
0/150
提交评论