版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第第2章章 C+对对C的扩充的扩充2.1 C+2.1 C+的特点的特点2.2 C+2.2 C+语言的文件扩展名语言的文件扩展名2.3 2.3 注释符注释符2.4 2.4 名字空间名字空间2.5 C+2.5 C+语言的输入输出语言的输入输出2.6 2.6 变量的定义变量的定义2.7 2.7 强制类型转换强制类型转换2.8 2.8 动态内存的分配与释放动态内存的分配与释放2.9 2.9 作用域运算符作用域运算符:2.10 2.10 引用引用2.11 const2.11 const修饰符修饰符2.12 2.12 字符串字符串2.13 C+2.13 C+语言中函数的新特性语言中函数的新特性习题习题OK
2、2.1 C+2.1 C+的特点的特点 C+C+语言既保留了语言既保留了C C语言的有效性、灵活性、语言的有效性、灵活性、便于移植等全部精华和特点,又添加了便于移植等全部精华和特点,又添加了,具有强大的编程功能,可方便地构,具有强大的编程功能,可方便地构造出模拟现实问题的实体和操作;编写出的程序造出模拟现实问题的实体和操作;编写出的程序具有结构清晰、易于扩充等优良特性,适合于各具有结构清晰、易于扩充等优良特性,适合于各种应用软件、系统软件的程序设计。用种应用软件、系统软件的程序设计。用C+C+编写编写的程序可读性好,生成的代码质量高,运行效率的程序可读性好,生成的代码质量高,运行效率仅比汇编语言
3、慢仅比汇编语言慢10%10%20%20%。2.2 C+2.2 C+语言的文件扩展名语言的文件扩展名 (1)(1)规定用规定用“”(意即(意即)作为)作为C+C+语言源文件的扩展名语言源文件的扩展名, ,“cppcpp”的文件扩展名的文件扩展名与操作系统无关。与操作系统无关。(2)(2)与与C+C+语言源文件相关的头文件扩展名一般语言源文件相关的头文件扩展名一般仍用仍用“”,但有些操作系统也有规定使用,但有些操作系统也有规定使用“.hpp.hpp”充当头文件扩展名的。充当头文件扩展名的。2.3 2.3 注释符注释符 1. 1. 段注释:段注释: / /* * */ / 2. 2. 单行注释:单行
4、注释:/ / 当只做单行注释时便当只做单行注释时便可用可用“/”符号表示从此符号起至行尾均符号表示从此符号起至行尾均为行注释内容。为行注释内容。 3. 3. 程序编译时将忽略所有的注释内容。程序编译时将忽略所有的注释内容。2.4 2.4 名字空间(名空间名字空间(名空间namespacenamespace) 名字空间域是随标准名字空间域是随标准C+C+而引入的。它相当而引入的。它相当于一个更加灵活的文件域(全局域),可以用于一个更加灵活的文件域(全局域),可以用花括号把文件的一部分括起来,并以关键字花括号把文件的一部分括起来,并以关键字namespacenamespace开头给它起一个名字:开
5、头给它起一个名字: Note:Note:(1)(1)声明块中可以包括:声明块中可以包括:等。等。(2)(2)在域外使用域内的成员时,需加上名字空间名作为在域外使用域内的成员时,需加上名字空间名作为前缀,后面加上域操作符前缀,后面加上域操作符“” 。如。如:ns1:ans1:a,ns1:fun1()ns1:fun1()等等。等等。(3)(3)这里添加了名字空间名称的成员名被称为这里添加了名字空间名称的成员名被称为(4)(4)最外层的名字空间域称为全局名字空间域(最外层的名字空间域称为全局名字空间域(global global namespace scopenamespace scope),即),
6、即。(5)(5)名字空间域可名字空间域可,同样有分层屏蔽作用。,同样有分层屏蔽作用。例如:例如:namespace n1namespace n1 namespace n2 namespace n2 / / 名字空间嵌套名字空间嵌套 class matrixclass matrix / / 名字空间类成员名字空间类成员matrixmatrix 访问访问matrixmatrix,可写:,可写:。(6)(6)使用使用可可。usingusing声明以关键字声明以关键字开头,后面是开头,后面是,例如:,例如:using n1:n2:matrix;using n1:n2:matrix;/ / 名字空间类成
7、员名字空间类成员matrixmatrix的的usingusing声明声明以后在程序中使用以后在程序中使用matrixmatrix时,就可以时,就可以(7)(7) 使用使用可以可以,比,比usingusing声明方声明方便。便。usingusing指示符以关键字指示符以关键字开头,后面是开头,后面是,然后是,然后是。 (8) (8)标准标准C+C+库中的所有组件都是在一个被称库中的所有组件都是在一个被称为为的名字空间中声明和定义的。在采用标的名字空间中声明和定义的。在采用标准准C+C+的平台上使用的平台上使用,只要写一个只要写一个usingusing指示符:指示符: 就可以直接使用就可以直接使用
8、中的所有成员。中的所有成员。 注意:如果使用了名空间注意:如果使用了名空间stdstd,则在使用,则在使用#include#include编译预处理命令包含头文件时,必编译预处理命令包含头文件时,必须须,否则会出错。,否则会出错。2.5 C+2.5 C+语言的输入输出语言的输入输出 C+ C+语言另外定义了一套语言另外定义了一套来来替代替代C C语言中对标准输入、输出函数的引用。语言中对标准输入、输出函数的引用。C+C+语言的保留字为:语言的保留字为:coutcout“输出内容输出内容”cin“输入内容输入内容”; / cin/ cin为标为标准输入流对象准输入流对象( (默认默认) )【例例
9、2.1】C+的输入输出举例。的输入输出举例。#include / 使用名空间使用名空间std,则必须去掉,则必须去掉.h扩展名扩展名using namespace std; void main() char name10; int age; coutname; coutage; coutname is nameendl; coutage is ageendl;2.6 2.6 变量的定义变量的定义(1)(1)一是允许变量的一是允许变量的定义语句可以出现在程序的任定义语句可以出现在程序的任何位置何位置,使得局部变量的定义点与使用点不至于离使得局部变量的定义点与使用点不至于离得太远,增强程序的可读性
10、,而且也不必在编写某一得太远,增强程序的可读性,而且也不必在编写某一程序块的开始时就考虑要用到哪些变量程序块的开始时就考虑要用到哪些变量;(2)(2)二是二是允许直接使用结构体名定义变量允许直接使用结构体名定义变量,这种,这种扩展为程序员在编程中提供了不少方便。类似地在扩展为程序员在编程中提供了不少方便。类似地在C+C+语言中联合名、枚举名也可在定义后独立地作为语言中联合名、枚举名也可在定义后独立地作为类型名使用。类型名使用。#includeusing namespace std;void main() struct studentint no;float math; ;int n;cinn;
11、 wang.no=n;cinwang.math;coutwang.no wang.mathendl;2.7 强制类型转换强制类型转换格式:格式:(数据类型数据类型) (表达式表达式)数据类型数据类型 (表达式表达式)(1) (1) 通过强制类型转换,得到一个所需类型的中间值,通过强制类型转换,得到一个所需类型的中间值,该中间值被引用后即自动释放。原来表达式的值类型并该中间值被引用后即自动释放。原来表达式的值类型并未改变。如下列代码段:未改变。如下列代码段:int b;float f;f=float(b);int b;float f;f=float(b);/可写成:可写成:f=(float)b;
12、 f=(float)b; 此时变量此时变量。(2) (2) 强制类型转换符优先级较高,只对紧随其后的表达强制类型转换符优先级较高,只对紧随其后的表达式 起 作 用 , 而 对 其 他 部 分 不 起 作 用 。 如 表 达 式式 起 作 用 , 而 对 其 他 部 分 不 起 作 用 。 如 表 达 式float(i)float(i)* *f f的含义是先将变量的含义是先将变量,然后与变量,然后与变量f f运算。运算。(3) (3) 强制类型转换应当用在不做转换将影响表达式结果强制类型转换应当用在不做转换将影响表达式结果的正确性或精度,或不能完成相应运算的场合。而对于的正确性或精度,或不能完成
13、相应运算的场合。而对于系统可以自动转换类型的场合,则没有必要使用。系统可以自动转换类型的场合,则没有必要使用。2.8 2.8 动态内存的分配与释放动态内存的分配与释放1.new1.new运算符运算符 指针变量指针变量 = new = new 数据类型数据类型; ; new new从从中为程序分配可以保存某种类型数据中为程序分配可以保存某种类型数据的一块内存空间,并返回指向该内存的的一块内存空间,并返回指向该内存的,该,该地址存放于地址存放于中。中。 2.delete2.delete运算符运算符运算符运算符deletedelete用于释放用于释放newnew分配的内存空间,它的使用形分配的内存空
14、间,它的使用形式为:式为:delete delete 指针变量;指针变量;其中的指针变量保存着其中的指针变量保存着newnew动态分配的内存的首地址。动态分配的内存的首地址。3. 3. 注意:注意:(1) (1) 用用newnew获取的内存空间,必须用获取的内存空间,必须用deletedelete进行释放;进行释放;(2) (2) 对一个指针只能调用一次对一个指针只能调用一次deletedelete;(3) (3) 用用deletedelete运算符作用的对象必须是用运算符作用的对象必须是用newnew分配的内存分配的内存空间的首地址。空间的首地址。#include #include usin
15、g namespace std;using namespace std;void main()void main()int int * *p;p;p=new int; / p=new int; / 分配内存空间分配内存空间* *p=5;p=5;coutcout* *p;p;delete p; / delete p; / 释放内存空间释放内存空间【例例2.32.3】newnew与与deletedelete应用举例。应用举例。在用在用new分配内存的同时进行初分配内存的同时进行初始化。使用形式为:始化。使用形式为:指针变量指针变量 = new = new 数据类型数据类型(初始值);(初始值);例
16、如上例中的:例如上例中的:p=new int;p=new int;* *p=5;p=5;也可写成:也可写成:p=new int(5)p=new int(5); 4 4用用newnew建立数组类型的变量建立数组类型的变量 语法:指针变量语法:指针变量= new = new 数据类型数据类型 数组大小数组大小;delete delete 指针变量指针变量; ;多维数组:多维数组:指针变量指针变量= new = new 数据类型数据类型 数组大小数组大小可用变量可用变量固定大小固定大小;delete delete 指针变量指针变量;/delete ;/delete 指针变量指针变量; ;例如:略(板
17、书)例如:略(板书)4 4用用newnew建立数组类型的变量建立数组类型的变量 注意在使用注意在使用delete时,不用考虑数组的维数。时,不用考虑数组的维数。当不能成功地分配到所需要的内存时,当不能成功地分配到所需要的内存时,new返回返回0,即空,即空指针。例如:指针。例如:int int * *p= new int100;p= new int100;if(p=0)cout cant allocate more memory,terminating. endl;exit(1);其中其中exit函数的作用是终止程序运行。函数的作用是终止程序运行。#include #include using
18、 namespace std;using namespace std;void main()void main() int n; / int n; / 定义数组元素的个数定义数组元素的个数 int int * *p; p; cout please input the length of the coutn; cinn;【例例2.42.4】从堆内存中获取一个整型数组,赋值后并打印出来。从堆内存中获取一个整型数组,赋值后并打印出来。if(p=new intn)=0) if(p=new intn)=0) c o u t c a n t a l l o c a t e m o r e c o u t
19、c a n t a l l o c a t e m o r e memory,terminating. endl;memory,terminating. endl;exit(1); / exit(1); / 分配内存空间分配内存空间 for( int i=0;in;i+) for( int i=0;in;i+) pi= i pi= i * *2;2; coutNow output the array : endl; coutNow output the array : endl; for( i=0;in;i+) for( i=0;in;i+) coutpi ; coutpi ; coutend
20、l; coutendl; delete p; / delete p; / 释放内存空间释放内存空间 2.9 2.9 作用域运算符作用域运算符: : 通常情况下,如果全局变量与局部变量同通常情况下,如果全局变量与局部变量同名,那么局部变量在其作用域内具有较高的优名,那么局部变量在其作用域内具有较高的优先权。先权。C C语言规定只能在变量的作用域内使用语言规定只能在变量的作用域内使用该变量,不能使用其他作用域中的变量,可采该变量,不能使用其他作用域中的变量,可采用用C+C+中提供的作用域运算符中提供的作用域运算符:,它能指定所,它能指定所需要的作用域。需要的作用域。 注意:不能用注意:不能用:访问
21、函数中的局部变量。访问函数中的局部变量。在在C+C+语言中作用域运算符语言中作用域运算符:还用来限定类的还用来限定类的成员,成员, #include using namespace std;float a=2.4; / 全局变量全局变量void main() int a=8; / 局部变量局部变量coutaendl;cout:aendl; / :a表示全局作用域中的变量表示全局作用域中的变量a 2.10 2.10 引用引用(1)(1)引用是引用是C+C+语言的一个特殊的数据类型描述,用于语言的一个特殊的数据类型描述,用于在程序的不同部分使用两个以上的变量名指向同一地在程序的不同部分使用两个以上
22、的变量名指向同一地址,使得对其中任一个变量的操作实际上都是对同一址,使得对其中任一个变量的操作实际上都是对同一地址单元进行的。地址单元进行的。(2)(2)在这种两个以上变量名的关系上,被声明为引用在这种两个以上变量名的关系上,被声明为引用类型的变量名则是实际变量名的别名。类型的变量名则是实际变量名的别名。引用运算符为引用运算符为& &,声明引用的一般形式为:,声明引用的一般形式为:数据类型数据类型 & &引用变量名引用变量名 = = 变量名;变量名;或或 数据类型数据类型& & 引用变量名引用变量名 = = 变量名;变量名;或或 数据类型数据类型
23、 & & 引用变量名引用变量名 = = 变量名;变量名; 2.10 2.10 引用引用(3)(3)对引用进行操作,实际上就是对被引用的变量进对引用进行操作,实际上就是对被引用的变量进行操作。行操作。(4)(4)引用不是值,不占存储空间,声明引用时,目标引用不是值,不占存储空间,声明引用时,目标的存储状态不会改变。引用一旦被初始化,就不能再的存储状态不会改变。引用一旦被初始化,就不能再重新赋值。重新赋值。 【例例2.52.5】引用举例。引用举例。#include #include void main()void main() int num=50 int num=50;int &
24、amp;ref=numint &ref=num;ref+=10ref+=10;coutnum=numendlcoutnum=numendl;cout ref=refendl;cout ref=refendl; num+=40 num+=40;cout num=numendlcout num=numendl;coutref=refendl;coutref=refendl; 说明:说明:(1) (1) 在一行上声明多个引用型变量在一行上声明多个引用型变量( (函数函数) )名时,要名时,要在每个变量在每个变量( (函数函数) )名前都冠以名前都冠以“& &”符号。符号。(2
25、) (2) 引用不是变量引用不是变量,所以引用本身不能被修改,所以引用本身不能被修改,在程序中对引用的存取都是对它所引用的变量的存在程序中对引用的存取都是对它所引用的变量的存取。取。(3) (3) 一个变量被声明为一个变量被声明为引用时必须进行初始化,引用时必须进行初始化,除非这个引用是用作函数的参数或返回值除非这个引用是用作函数的参数或返回值,为,为引用提供的初始值应为引用提供的初始值应为变量(包括对象变量(包括对象)。引用)。引用一旦被初始化一旦被初始化, ,就就不能不能再重新赋值。如再重新赋值。如ref=&jref=&j; ;但但ref=jref=j; ;是是允许允许的。
26、的。(4) 由于由于引用不是变量引用不是变量,所以,不能说明,所以,不能说明引用的引用引用的引用,也不能说明数组元素的类型为引用数组也不能说明数组元素的类型为引用数组,或指向,或指向引用的指针引用的指针。例如:。例如:int &a5; / 错误错误 int &*p;/ 错误错误由于指针也是变量,因此可以说明由于指针也是变量,因此可以说明对指针变量的引对指针变量的引用用。例如:。例如:int int * *a; int a; int * *&p=a; int b; p=&b; / a&p=a; int b; p=&b; / a指向变量指向变量b b
27、(5) 引用与指针不同。指针的内容或值是某一变量的内引用与指针不同。指针的内容或值是某一变量的内存单元地址,而存单元地址,而引用则与初始化它的变量具有相引用则与初始化它的变量具有相同的内存单元地址同的内存单元地址。指针是个变量,可以把它再赋。指针是个变量,可以把它再赋值成其它的地址,然而,值成其它的地址,然而,建立引用时必须进行初始建立引用时必须进行初始化并且决不会再指向其它不同的变量化并且决不会再指向其它不同的变量。(6) 要注意区分引用运算符和地址运算符的区别。例要注意区分引用运算符和地址运算符的区别。例如:如:int num=50;int &ref=num;int *p=&
28、;ref;(7) 可以用一个引用初始化另一个引用。例如:可以用一个引用初始化另一个引用。例如:int num=50;int &ref1=num;int &ref2=ref1;ref2=100;/ num被修改为被修改为100其中其中ref2也是对也是对num的引用。的引用。(8) (8) 可以把函数的参数说明成引用以建立函数参数的可以把函数的参数说明成引用以建立函数参数的引用传递引用传递方式方式。 例例2.72.7数值交换(引用作为函数参数)举例。数值交换(引用作为函数参数)举例。#include#includeusing namespace std;using namespa
29、ce std;void s &rx,int &ry)void s &rx,int &ry) int temp=rx;int temp=rx;rx=ry;rx=ry;ry=temp; ry=temp; void main()void main() int x=5,y=6;int x=5,y=6;coutbefore sawp,x:x,y:yendl;coutbefore sawp,x:x,y:yendl;s);s);coutafter sawp,x:x,y:yendl;coutafter sawp,x:x,y:yendl; (9) (9) 有空指针,无空引用有空指
30、针,无空引用(10) (10) 引用不能用数据类型来初始化。如:引用不能用数据类型来初始化。如: int &ref=intint &ref=int; / error/ error(11) (11) 函数调用可以作为左值函数调用可以作为左值 引用表达式是一个左值表达式,因此它可以出现在形、实参数引用表达式是一个左值表达式,因此它可以出现在形、实参数的任何一方。若一个函数返回了引用,那么该函数的调用也可以被的任何一方。若一个函数返回了引用,那么该函数的调用也可以被赋值。一般说,当返回值不是本函数内定义的局部变量时就可以返赋值。一般说,当返回值不是本函数内定义的局部变量时就可以返回一
31、个引用。在通常情况下,引用返回值只用在需对函数的调用重回一个引用。在通常情况下,引用返回值只用在需对函数的调用重新赋值的场合,也就是对函数的返回值重新赋值的时候。避免将局新赋值的场合,也就是对函数的返回值重新赋值的时候。避免将局部作用域中变量的地址返回,就使函数调用表达式作为左值来使用。部作用域中变量的地址返回,就使函数调用表达式作为左值来使用。【例例2.82.8】统计学生中统计学生中A A类学生与类学生与B B类学生各为多少个。类学生各为多少个。A A类学生的标类学生的标准是平均分在准是平均分在8080分以上,其余都是分以上,其余都是B B类学生。类学生。【例例2.92.9】返回的局部作用域
32、内的变量,函数作为左值。返回的局部作用域内的变量,函数作为左值。如何:改掉警告错误?如何:改掉警告错误?补充:数组的引用(补充:数组的引用(P25)2.11 const2.11 const修饰符修饰符#define PI 3.1415926#define PI 3.1415926const float PI=3.1415926; const float PI=3.1415926; 这个常量是有类型的,它有地址,可以用这个常量是有类型的,它有地址,可以用指针指向这个值,但不能修改它。指针指向这个值,但不能修改它。C+C+建议用建议用constconst取代取代#define#define定义常量
33、。定义常量。 注意:注意:(1) (1) 使用使用constconst修饰符定义常量时,必须初始修饰符定义常量时,必须初始化;化;(2) (2) 常量一旦被定义,在程序中任何地方都不常量一旦被定义,在程序中任何地方都不能能 再更改。再更改。(3) (3) 如果用如果用constconst定义的是一个整型常量,定义的是一个整型常量,intint可以省略。可以省略。(4) (4) 与与#define#define定义的常量有所不同,定义的常量有所不同,constconst定定义的常量可以有自己的数据类型,这样义的常量可以有自己的数据类型,这样C+C+编译程序可以进行更加严格的类型检查,编译程序可以
34、进行更加严格的类型检查,具有良好的编译时的检测性。具有良好的编译时的检测性。 (5) (5) 函数参数也可以用函数参数也可以用constconst说明,用于保证实参说明,用于保证实参在该函数内部不被改动,大多数在该函数内部不被改动,大多数C+C+编译器能对具有编译器能对具有constconst参数的函数进行参数的函数进行更好的代码优化更好的代码优化。例如,通。例如,通过函数过函数maxmax求出整型数组求出整型数组a100a100中的最大值,函数原中的最大值,函数原型应该是:型应该是: int int max(constmax(const int int* *pa);pa); 这样做的目的是这
35、样做的目的是确保原数组的数据不被破坏,确保原数组的数据不被破坏,即在函数中对数组元素的操作只许读,不许写即在函数中对数组元素的操作只许读,不许写。constconst与指针一起使用的组合情况与指针一起使用的组合情况: :许的:许的:pc=jkkk;pc=jkkk;2.12 2.12 字符串字符串在在C+C+中提供了一种既方便又好用的中提供了一种既方便又好用的类型。下面通过一个简单的例子说明类型。下面通过一个简单的例子说明类型的使用。类型的使用。【例例2.102.10】字符串类字符串类stringstring的使用。的使用。2.13 C+2.13 C+语言中函数的新特性语言中函数的新特性2.13
36、.1 2.13.1 函数原型(函数原型(Function PrototypeFunction Prototype)2.13.2 2.13.2 内联(内联(inlineinline)函数)函数2.13.3 2.13.3 带缺省参数的函数带缺省参数的函数2.13.4 2.13.4 函数重载(函数重载(overloadoverload)2.13.5 2.13.5 函数模板(函数模板(function templatefunction template)vC+C+要求为每一个函数建立原型,用以说明函数的要求为每一个函数建立原型,用以说明函数的名称、参数个数及类型和函数返回值的类型。名称、参数个数及类型
37、和函数返回值的类型。v其主要目的是让其主要目的是让C+C+编译程序进行类型检查,即形编译程序进行类型检查,即形参与实参的类型匹配检查,以及返回值是否与原型参与实参的类型匹配检查,以及返回值是否与原型相符,以维护程序的正确性。所以应养成将声明与相符,以维护程序的正确性。所以应养成将声明与定义分别编写的编程习惯。定义分别编写的编程习惯。v函数原型与函数的定义要在函数的返回类型,函数函数原型与函数的定义要在函数的返回类型,函数名和参数的类型及数量这三条线上保持一致。名和参数的类型及数量这三条线上保持一致。v当然,在写函数原型时,可以省略形参的名字,因当然,在写函数原型时,可以省略形参的名字,因为参数
38、名对编译器没有意义,但如果取名恰当的话,为参数名对编译器没有意义,但如果取名恰当的话,这些名字可以起到提示参数用途的作用。这些名字可以起到提示参数用途的作用。2.13.1 2.13.1 函数原型(函数原型(Function PrototypeFunction Prototype)2.13.2 内联(inline)函数使用内联函数是一种用使用内联函数是一种用空间换时间空间换时间的措施,的措施,若内联函数较长,且调用太频繁时,程序将加长很多。若内联函数较长,且调用太频繁时,程序将加长很多。因此,通常因此,通常只有较短的函数才定义为只有较短的函数才定义为内联函数内联函数,对于较长的函数最好作为一般函
39、数处,对于较长的函数最好作为一般函数处理。理。2.13.2 内联(inline)函数一般情况下,我们对内联函数做如下的一般情况下,我们对内联函数做如下的限制:限制:(1) (1) 不能有递归不能有递归(2) (2) 不能包含静态数据不能包含静态数据(3) (3) 不能包含循环不能包含循环(4) (4) 不能包含不能包含switchswitch和和gotogoto语句语句(5) (5) 不能包含数组不能包含数组 若一个内联函数定义不满足以上限制,则编译系若一个内联函数定义不满足以上限制,则编译系统把它当作统把它当作普通函数普通函数对待。对待。【例2.11】内联函数的使用。 如果在函数说明或函数定
40、义中为形参指定一个缺省值,如果在函数说明或函数定义中为形参指定一个缺省值,则称此函数为带缺省参数的函数。当函数调用发生后,在则称此函数为带缺省参数的函数。当函数调用发生后,在形参表中等号后的各形参表中等号后的各“缺省值缺省值”将起实参的传递作用。将起实参的传递作用。如果函数有多个缺省参数,则缺省参数必须是从右向如果函数有多个缺省参数,则缺省参数必须是从右向左定义,并且在一个缺省参数的右边不能有未指定缺省值左定义,并且在一个缺省参数的右边不能有未指定缺省值的参数。的参数。 void fun(int a=3,int b=6,int c,int d);void fun(int a=3,int b=6
41、,int c,int d);void fun(int a=65,int b=3,int c,int d=3);void fun(int a=65,int b=3,int c,int d=3);需要特别注意的是如果在函数原型的声明中设置了函需要特别注意的是如果在函数原型的声明中设置了函数参数的缺省值,则不可再在函数定义的头部重复设置,数参数的缺省值,则不可再在函数定义的头部重复设置,否则编译时将出现错误信息。否则编译时将出现错误信息。( (思考:如果函数原型中无缺思考:如果函数原型中无缺省值,定义时有,正确吗?省值,定义时有,正确吗?) )2.13.42.13.4函数重载(函数重载(overlo
42、adoverload)C+C+编译系统允许为两个或两个以上的函数取相编译系统允许为两个或两个以上的函数取相同的函数名,但是形参的个数或者形参的类型不应相同的函数名,但是形参的个数或者形参的类型不应相同,编译系统会根据实参和形参的类型及个数的最佳同,编译系统会根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数,这就是所谓的函数匹配,自动确定调用哪一个函数,这就是所谓的函数重载。重载。 函数重载无需特别声明,只要所定义的函数与函数重载无需特别声明,只要所定义的函数与已经定义的同名函数形参形式不完全相同,已经定义的同名函数形参形式不完全相同,C+C+编译编译器就认为是函数的重载。器就认为是
43、函数的重载。【例例2.122.12】重载函数应用举例重载函数应用举例 在使用重载函数时要注意在使用重载函数时要注意: : 不可以定义两个具有相同名称、相同参数类型和不可以定义两个具有相同名称、相同参数类型和相同参数个数,只是函数返回值不同的函数。相同参数个数,只是函数返回值不同的函数。int func(int x)int func(int x);float func(int x)float func(int x); 如果某个函数参数有缺省值,必须保证其参数缺如果某个函数参数有缺省值,必须保证其参数缺省后调用形式不与其它函数混淆。省后调用形式不与其它函数混淆。int f(int a, float
44、 b);int f(int a, float b);void f(int a, float b, int c=0);void f(int a, float b, int c=0);函数调用语句:函数调用语句:f(10, 2.0);f(10, 2.0);具有二义性,既可以调用第一个函数,也可以调用第具有二义性,既可以调用第一个函数,也可以调用第二个函数,编译器不能根据参数的形式确定到底调用二个函数,编译器不能根据参数的形式确定到底调用哪一个。哪一个。2.13.52.13.5函数模板(函数模板(function templatefunction template) C+ C+语言中可以使用模板来避
45、免在程序中多次书语言中可以使用模板来避免在程序中多次书写相同的代码。所谓模板是一种使用无类型参数来产写相同的代码。所谓模板是一种使用无类型参数来产生一系列函数或类的机制,是生一系列函数或类的机制,是C+C+的一个重要特征。的一个重要特征。它的实现方法方便了更大规模的软件开发。模板是以它的实现方法方便了更大规模的软件开发。模板是以一种完全通用的方法来设计函数和类,而不必预先说一种完全通用的方法来设计函数和类,而不必预先说明将被使用的每个对象的数据类型。通过模板可以产明将被使用的每个对象的数据类型。通过模板可以产生类或函数的集合,使它们操作不同的数据类型,从生类或函数的集合,使它们操作不同的数据类型,从而避免为每一种数据类型产生
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026基层血液透析室(中心)建设与服务指南学习解读课件
- 怀化市2026年高三第六次模拟考试语文试卷含解析
- 【浙江省杭州市思想政治高二下学期期末巩固要点解析】
- 四川省遂宁市射洪中学2025-2026学年高二下学期期中考试生物试卷
- 【新教材】冀美版(2024)一年级下册美术第3单元 第1课 乌云飘雨点落 教学设计
- 【2026】年农作物种植技能基础知识考试题与答案
- 2026年广东深圳宝安区中考二模语文试卷试题(精校打印)
- 26年机构禁忌讲解课件
- 应急预案评估要点
- 主题教育本质思考
- 2026年重大事故隐患判定标准宣贯培训材料
- 约当产量比例法公开课一等奖市赛课获奖课件
- 11-毕业设计(论文)撰写套用格式
- 螺栓、双头螺栓长度计算工具
- 通风管道安装工程、通风空调工程施工方案
- LY/T 2489-2015木材交付通用技术条件
- 康复医学与理疗学硕士研究生培养方案
- 初中物理实验操作考试评分细则
- 高中英语新教材选修二Unit3Times-change-A-new-chapter课件
- 2022年天津市初中地理会考试卷及答案
- 肉毒素注射教学课件
评论
0/150
提交评论