13.2 内联函数
简介
相当于把函数内的代码复制到函数调用处执行,提高速度。
(普通函数是根据指针找到函数所在内存空间执行。)
速度快,但是内存的牺牲比较大。
使用
前世今生
在c中,用define作“替换”操作:
好处显而易见,可以输出很多类型。
但是缺点也是很明显的,他实际上是替换,不是真正的函数,所以会有如下的结果:
S(5+10) // <<==>> 5 + 10 * 5 + 10
所以结果一定不是15*15。
为了解决这个,产生了内联函数。
13.3 引用
引用要比指针安全得多:
存在野指针,可能因为对野指针的误操作而破坏系统文件;
“引用”在定义的时候就需要指向已定义的变量或常量,不存在对系统文件的误操作。
指向常量可以使用const:
const double& ref_double = 12.0;
利用“引用”在函数内改变实参:
效果跟传入指针是一样的:
但是在调用的时候,指针需要传入地址,而应用只需要传入变量就可以了:
Swap3(num1, num2);
Swap2(&num1, &num2);
可以看出,引用的方法更为方便和清晰。
注意:如果不想被引用的内容被更改,可以函数声明和定义中在引用前加const。
13.5 返回“引用”
函数返回“引用”类型值,如果引用的是局部变量,那么在函数结束时这块内存会被释放。
这将导致这个变量随时可能被其他操作覆盖,以下举例:
此时返回正确,因为内存虽然被释放,但是这块内存没有被其他操作覆盖,所以依然为3。
可以看出,test()函数并没有对get值做任何的修改,但是打印的get值已经发生了改变,
说明sum()函数中的局部变量所在内存已经被test()函数中的变量定义操作覆盖了,get引用的已经不再是sum()函数中局部变量的值,而是覆盖后的值。
总结:不要返回局部变量的引用。
省略return
如果返回引用型函数中没有return,则会返回最后被操作的变量值。
上图错误解释,return应该返回已存在内存空间的引用,num1+num2是两块内存空间中值得和,并不能自动生成新的内存空间,所以会报错。
返回引用的函数可以直接修改所引用内存中的值
可以看出result和sum(num)引用的内存是同一个,所以修改其一,另一个也会改变。
小结: