面向对象程序设计课件第2章.ppt

上传人:sccc 文档编号:5373042 上传时间:2023-06-30 格式:PPT 页数:50 大小:324.01KB
返回 下载 相关 举报
面向对象程序设计课件第2章.ppt_第1页
第1页 / 共50页
面向对象程序设计课件第2章.ppt_第2页
第2页 / 共50页
面向对象程序设计课件第2章.ppt_第3页
第3页 / 共50页
面向对象程序设计课件第2章.ppt_第4页
第4页 / 共50页
面向对象程序设计课件第2章.ppt_第5页
第5页 / 共50页
点击查看更多>>
资源描述

《面向对象程序设计课件第2章.ppt》由会员分享,可在线阅读,更多相关《面向对象程序设计课件第2章.ppt(50页珍藏版)》请在三一办公上搜索。

1、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、号在其作用域内就表示这个常量 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;数组

3、常量的定义格式如下: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

4、caclArea(int r)return 3.1416*r*r;,2 内联函数的执行程序无需跳转对内联函数而言,在程序编译期间,编译器将使用内联函数的函数体直接替换函数调用。因此,内联函数的运行速度比常规函数稍快。需要占用更多的空间如果程序在10个不同的地方调用了同一个内联函数,则程序将包含该函数的10个代码拷贝,因此如果函数代码长度过大,超出了跳转语句所占空间的长度,就会增加整个程序的代码量,使程序运行的空间开销大大增加了内联的实质用空间来换取时间空间开销增大了,时间开销却减少了,从而提高了程序的执行效率。,3 内联函数的定义,在函数声明前加上关键字inline。在函数定义前加上关键字in

5、line。如: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);/函数声明,此处无inlineint main()int i=5;double dCirlcle;for(i=1;i=5;i+)d

6、Cirlcle=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 SQUA

7、RE(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);dou

8、ble Max(double,double);,2重载函数的匹配,在函数同名的情况下,编译器是根据函数的参数列表。它是函数重载的关键。如果两个函数的参数数目和类型相同,同时参数的排列顺序也相同,则它们的特征标相同,如果参数列表相同仅有函数返回值类型不同,是不能够重载的。下面的几个重载函数就具有不同参数列表:int add(int a,int b);double add(double a,double b);float add(folat a,folat b),重载函数的匹配,当某个函数中调用重载函数时,编译器会根据实参类型调用相应的函数。匹配的过程按如下步骤进行:如果有严格的匹配的函数,就调用

9、该函数。参数内部转换后如果匹配,则调用该函数。通过用户定义的转换寻求匹配。例如,如下两个重载函数: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);,使用重载函数

10、时的注意事项:,(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)en

11、dl;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;,程序的输出结果为:15155,例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 mi

12、n(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 函数参数的默认值,默认参数指的是当函数调用中省略了实参时,自动使用的一个值。如何设置默认值呢?必须通过函数的原型。由于编译器是通过检查

13、原型来了解函数所使用的参数数目,因此函数原型必须将可能的默认参数告知程序。方法是将值赋给原型中的参数。如: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)couta=a,b=b,c=cendl;in

14、t main()fun();fun(9);fun(4,5);fun(7,8,9);return 0;,程序的输出结果为:a=1,b=2,c=3a=9,b=2,c=3a=4,b=5,c=3a=7,b=8,c=9,(2)默认参数并不一定是常量,它可以是任意的表达式,甚至可以通过函数调用给出。如果默认参数是表达式,则函数每次调用时,该表达式将被重新求值。默认值一般是全局变量,而不是局部变量,因为默认参数的调用是在编译时去确定的,而局部变量编译时无法确定。,例2-5 带默认参数值的函数,#include using namespace std;int q(5),p(7);int sum_int(int

15、 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);couts1=s1ns2=s2endl;return 0;,int sum_int(int a,int b,int c)return a+b+c;,程序的输出结果为:s1=52s1=50,(3)对于带参数列表的函数,必须从右向左添加默认值。也就是说,要为某个参数设置默认值,则必须为它右边的所有参数提供默认值,下面的函数原型说明中,有些是不正确的。int fun(int m,int n=3,int j=5);int fun(

16、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

17、,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后加一个标识符构成,

18、在这里,两个关键字的意义相同,它们表示后面的参数名代表一个潜在的内置或用户定义的类型。,示例,templatevoid Swap(AnyType,3 实例化函数模板,所谓实例化函数模板,就是编辑器根据函数调用时具体的参数类型,按照模板样式,创建具体函数的过程。在编译过程中,当编译器发现有一个函数调用()时,它将根据中的具体类型实参生成一个重载函数即模板函数。该模板函数的定义体与函数模板的定义体相同,而类型则以类型来代替。,例2-6 交换两个数的函数模版,#include/函数模板原型 template/或者是 tempplatevoid Swap(AnyType,/函数模板定义template

19、/或者是tempplatevoid Swap(AnyType,4 函数模板与模板函数,函数模板与模板函数的主要区别在于:(1)函数模板不是一个函数,而是对一组函数的描述,是一组函数的模板,在定义时使用了参数化类型。(2)模板函数是一种实实在在的函数定义,它的函数体与某个函数模板的函数体相同,编译器遇到模板函数调用时,将生成可执行代码。,5 重载函数模板,函数模板与普通函数一样,也可以重载。这里包含两种含义,第一种是可以像重载常规函数定义那样重载模板定义,另一种重载常规函数定义。下面我们分别通过举例来说明这两种重载函数模板的情形。,(1)重载函数模板定义,例2-7 重载函数模板定义两个Swap函

20、数模板重载#include template/原来定义的模板 void Swap(AnyType,templatevoid Swap(AnyType,输出结果:i,j=10,20.Using compiler generate int swapper:Now i,j=20,10.Original arrays:07/04/177607/20/1969Swapped arrays:06/20/196907/04/1776,(2)重载常规函数,对于重载常规函数而言,编译器的静态绑定1过程是遵循如下规则的:首先匹配类型完全相同的重载函数。其次才寻求函数模板来匹配。,例2-8 重载函数与函数模板的匹配过程,#include using namespace std;void Swap(int,void Swap(int,程序的执行结果如下:i,j=10,20Using int Swap function:Now i,j=20,10 x,y=2.45,8.17Using template function:Now x,y=8.17,2.45Using template function:c1,c2=A,Bnow c1,c2=B,A,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号