文档详情

函数和作用域-Read.ppt

发布:2017-04-18约2.16千字共72页下载文档
文本预览下载声明
第四章 函数、内联函数、函数重载与默认参数; 第四章 函数和作用域;4.1 函数的定义和声明;;;4.2 函数的调用与参数传递;4.2.1 函数的调用方法;4.2.1.1 函数的调用和返回序列;4.2.2 参数传递;4.2.2.1 传值调用-传值;执行过程;;执行过程;传值 vs 传指针;思考题1;答:程序崩溃。 因为GetMemory并不能传递动态内存,Test函数中的 str一直都是 NULL。strcpy(str, “hello world”);将使程序崩溃。;思考题2;答:可能是乱码。 因为GetMemory返回的是指向“栈内存”的指针,该指针的地址不是 NULL,但其原先的内容已经被清除,新内容不可知。 ;思考题3;答: (1)能够输出hello (2)内存泄漏:退出test()后,malloc分配的空 间将无法释放。;思考题4;答:篡改动态内存区的内容,后果难以预料,非常危险。 因为free(str)之后,str成为未初始化的野指针,并不是NULL。因此if(str != NULL)将总是为真。;4.2.2.3 引用传递; 形式参数只是实参的别名,因此函数调用时不需要 为它分配空间;尤其是传递大的对象。 在函数内对参数值的改变不再作用于局部拷贝,而 是直接针对实参;但是相对于指针传递而言,引用 传递的函数体定义和函数调用的形式更为简洁。; ;4.2.2.5 使用数组作函数参数;例:;int a[8] ={1,3,5,7,9,11,13}; void fun( int *pa, int n){ for (int i= 0;in-1;i++){ *(pa + 7) += *(pa + i); } } void main( ){ int m =8; fun(a,m); cout a[7]endl; };4.2.3 函数参数的求值顺序;4.2.4 返回语句实现过程(略);作业:;4.3 作用域;4.3.1 作用域;4.3.2 作用域的屏蔽规则;4.3.2.1 :: 全局作用域分辨符;作用域: 函数级; 块级。 生命期: 自动类变量; 内部静态变量;全局变量与局部变量;全局变量与局部变量(续);文件级作用域;文件级作用域(续);文件级作用域(续);4.3.4 内部静态变量;4.3.5 寄存器变量;小结;小结(续);4.4 内联函数注;4.4.1 内联函数(inline function);说明:;4.4.2 内联函数 vs 宏替换;4.4.3 内联函数 vs 直接代码比较;4.5 默认参数注;4.5.1 设置函数参数的默认值;// DefaultArgument.cpp #include iostream using namespace std; void main(){ CLOCK t1,t2,t3,t4,t5; setclock(t1); // t1=12:00:00 setclock(t2, 7); // t2=07:00:00 setclock(t3,14,20); // t3=14:20:00 setclock(t4,18,30,0); // t4=18:30:00 setclock(t5,19, , 0) ; // 非法 } ;说明;说明(续);4.5.2 占位符参数;修改后:(见下页);long min( long a, long b, long c ) { …}; void main( ){ long a = 100, b=200; long c = min ( a, b, MAXNUMBER); long d = min(a, b, c); };4.6 函数重载注;4.6.1 重载的概念;c= max(a,b); d= max(a,b,c); 编译器根据什么来区分调用哪个函数? 函数名:相同,无法区分; 返回值类型:语句中不出现返回值类型,也无法区分; 参数:参数的个数和类型不同,可以区分。;4.6.2.1 参数类型不同的重载函数;4.6.2.2 参数个数不同的重载函数;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
显示全部
相似文档