函数和作用域-Read.ppt
文本预览下载声明
第四章 函数、内联函数、函数重载与默认参数; 第四章 函数和作用域;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
显示全部