c++学习杂记(4)

 函数

把相关的语句组合在一起,并赋予一个名字,这种形式的组合即函数(类似于脚本,只不过是命令而已),通常也叫例程或者过程。函数不允许嵌套定义,c++中函数声明就是函数原型,可以没有参数名字,当编译时编译器把调用函数与函数原型比较,链接时要调用函数定义,如果声明与调用不一致,那么编译会出问题,如果调用与定义不一致,那么会造成链接错误。被调用函数返回时有可能会自动的隐式转换(数据类型相容的话),如果不相容则会在编译时发生错误。

函数返回值即是函数值。在有返回类型的函数中,编译器首相进行求值运算,必要隐式转换,然后存入内存的某个区域(具体是编译器和类型而定)。然后将此变量的地址传给调用函数,然后调用函数将此值作为函数值返回。

当函数进行调用时,编译器会判断调用函数是否调用正确,其机制即使函数原型。main是特殊的函数,有操作系统调用,也要关系到栈。

全局变量和局部变量

整个程序可见的变量即全局变量,只能在一个函数可见是局部变量。

全局变量由编译器建立,初始化为0,在程序中的任何地方都可以定义全局变量,但必须在任何函数之外,其可见性为前面函数不可见,后面可见,但全局变量在main函数运行之前就已经存在了。

局部变量只在该函数内部可见,对外部不可见,故可以和外部重名,函数执行完之前必定已经被析构(除static和内存发生了泄露),局部变量放在栈区,函数开始运行时,在栈中分配内存,函数执行完被回收,局部变量默认值为随机。

函数调用机制

函数的调用过程即是一个栈空间操作的过程

建立被调函数栈空间->压入调用函数运行状态->压入返回地址->压入参数->将控制权交给被调用函数->分配临时变量......

其中参数按形参顺序压入。

main函数返回的地址应该在操作系统环境中,不同函数的栈空间应该是独立的,两者不能相互访问,调用函数和被调函数唯一的接口就是函数参数,故被调函数无法改变调用函数的局部变量(引用指针除外),但对全局变量有效。当函数返回后,栈空间被释放,局部变量形参等数据都消失了,但对应的内存里还没有改变,当再次分配并未初始化时,那么默认值就是上次调用释放后还没消失的数据。

静态局部变量

静态局部变量和全局变量类似,只是定义它的函数可见,故可以屏蔽,不用担心重名,只初始化一次,默认为0。(关于静态全局变量:和全局变量无区别,只是在多文件中其他文件对全局静态变量不可见)

递归函数

递归函数就是自调用函数,在函数体内自己调用自己(直接和间接)(注意递归函数的栈空间)

注:递归函数必须有完成语句,要有一个是否能避免递归调用的测试,要有一个递归调用语句,要先测试,后递归。

内联函数

内联函数作用:解决效率。

对象:效率高,代码短的函数。必须先声明,后调用。

个人认为内联函数和一般函数的本质区别是不调用栈空间。

注:内联函数有switch和while等语句,如果有,编译器会按照普通函数处理。递归函数不能作为内联函数

注:关于内联函数和宏定义:宏不会进行参数类型检查。

重载函数

对不同类型做不同运算而名字相同的情况为重载。

匹配重载函数顺序:严格匹配->内部转换寻求匹配->通过用户转换寻求匹配。

在c++中,如果函数在返回类型,函数名,参数类型,参数个数,参数顺序上不同,那么九视为不同的函数,但是重载函数仅仅在返回类型不同的话,那么条件是不充分的。让重载函数执行类似的功能,是很好的编程风格。

注:重载函数的内部实现:编译器利用名字粉碎实现

                                                   int f(char a);

                                                   int f(char a,int b,double c);

                          在内部表示为:f_c 和f_cid 函数名为:int f_cid以和重载函数区别。粉碎名字无法看见,只是链接错误时有可能看见。

默认参数的函数

当未给函数传值时,自动调用默认参数,默认参数函数在声明中提供,当有声明和定义时,定义时不能有默认参数,若只有定义,才可以出现在定义中。

顺序:默认参数从左到右定义,调用向左匹配

默认值可以是全局变量,全局常量,或则是函数,但不能是局部变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值