欢迎来到天天文库
浏览记录
ID:58670590
大小:177.00 KB
页数:72页
时间:2020-10-05
《第四章函数、内联函数、函数重载与默认参数ppt课件.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、第四章函数、内联函数、函数重载与默认参数面向对象程序设计(C++)第四章函数和作用域4.1函数的定义和声明4.2函数的调用和参数传递方式4.3函数的默认参数4.4内联函数4.5函数重载4.6函数的作用域4.1函数的定义和声明函数:本质上是一段参数化的共享代码。4.1.1函数的定义#includedoublesum(doublex,doubley){returnx+y;}voidmain(){doublea,b;cout<<“Inputdoubleaandb:”cin>>a>>b;dou
2、blesum=sum(a,b);cout<<“sum=”<<函数名>(<参数表>){〈若干条语句〉}4.1.2函数的声明intadd(int,int);voidmain(){inti=10,j=20;…;j=add(i,j);…;}intadd(inta,intb){return(a+b);}“一遍扫描”的需要。原则:定义在先,调用在后,调用前可以不必声明;定义在后,调用在前,调用前必须声明。<类型><函数名>(<参数表>);4.2函数的调用与参数传递函数调用语句中的函数名经编
3、译后变成函数的入口地址!4.2.1函数的调用方法语法:〈函数名〉(〈实参表〉)c=sum(a,b);swap(&a,&b);关键:“虚实结合”的问题!即:实在参数的值如何传递给形式参数?对形式参数的值的改变是否影响实在参数?4.2.1.1函数的调用和返回序列调用序列:1.分配函数局部空间(活动记录)2.参数传递3.保存返回地址4.控制转移5.执行函数返回序列:1.返回值传递2.控制转移3.返回主调函数4.2.2参数传递实参-- 形参值传递:把实际参数的值复制给形式参数,也就是说,形参和实参是两个不同的内存
4、空间。函数所处理的仅仅是实际参数的一个拷贝。引用传递:把实际参数的地址传递给形式参数,也就是说,形参和实参实际上是同一个内存空间。函数通过对形式参数的处理来达到对实际参数进行加工的目的。4.2.2.1传值调用-传值#includevoidswap1(intx,inty){inttemp;temp=x;x=y;y=temp;cout<<“x=”<5、6、)a,b的值被交换5959955&a&b传值vs传指针本质上都是值传递;适用于:当需要将一个类的大的对象作为参数传递给函数时;当参数值必须被修改后返回。思考题1voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,"helloworld");printf(str);}请问运行Test函数会有什么样的结果?答:程序崩溃。因为GetMemory并不能传递动态内存,Test7、函数中的str一直都是NULL。strcpy(str,“helloworld”);将使程序崩溃。16《面向对象程序设计》中国科技大学计算机系马建辉思考题2请问运行Test函数会有什么样的结果?char*GetMemory(void){charp[]="helloworld";returnp;}voidTest(void){char*str=NULL;str=GetMemory();printf(str);}答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原先的8、内容已经被清除,新内容不可知。18《面向对象程序设计》中国科技大学计算机系马建辉思考题3请问运行Test函数会有什么样的结果?voidGetMemory(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,"hello");printf(str);}答:(
5、
6、)a,b的值被交换5959955&a&b传值vs传指针本质上都是值传递;适用于:当需要将一个类的大的对象作为参数传递给函数时;当参数值必须被修改后返回。思考题1voidGetMemory(char*p){p=(char*)malloc(100);}voidTest(void){char*str=NULL;GetMemory(str);strcpy(str,"helloworld");printf(str);}请问运行Test函数会有什么样的结果?答:程序崩溃。因为GetMemory并不能传递动态内存,Test
7、函数中的str一直都是NULL。strcpy(str,“helloworld”);将使程序崩溃。16《面向对象程序设计》中国科技大学计算机系马建辉思考题2请问运行Test函数会有什么样的结果?char*GetMemory(void){charp[]="helloworld";returnp;}voidTest(void){char*str=NULL;str=GetMemory();printf(str);}答:可能是乱码。因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是NULL,但其原先的
8、内容已经被清除,新内容不可知。18《面向对象程序设计》中国科技大学计算机系马建辉思考题3请问运行Test函数会有什么样的结果?voidGetMemory(char**p,intnum){*p=(char*)malloc(num);}voidTest(void){char*str=NULL;GetMemory(&str,100);strcpy(str,"hello");printf(str);}答:(
此文档下载收益归作者所有