为什么产生引用?其中一个原因必然是因为指针比较抽象和麻烦拉
举个例子
void swap( int * q,int * p)
{
int temp;
temp=*p;
*p =*q;
*q= temp;
}
是不是很蛮烦,如果是引用呢?看:
void swap(int &a,int &b)
{
int temp;
temp = a;
a= b;
b= temp;
}
是不是会简短很多呢?
注意引用是给变量取别名,他并没有给变量开辟额外的空间,但是指针会额外开辟4个字节的空间储存地址。
可以看到a和的地址是一样的只是他们的名字不同而已,
2.一旦引用了一个实体就不能再引用其他实体,定义引用时必须将其初始化
3. 引用权限是能缩小不能放大,什么意思呢
这是什么原因导致的呢? 在给int类型给浮点类型取别名的时候会发生截断把整数部分截断这个过程就会产生一个临时变量,临时变量具有常属性不能被修改,所以得用const 修饰,如果用int 修饰就会扩大权限原本不能修改的值就能被修改了,还有
这就是权限缩小的例子。
int d;
int f = d;
这不叫取别名因为f的改变不应d;
3.引用做函数的参数 见swap
需要注意的是一般的会在其类型面前加上const ,这样可以接受不同的参数类型
4.引用作为函数的返回值,如果是就返回他的空间的别名,如果这个变量出了函数作用域就销毁
那么他的值可能变化也可能不变主要取决于有没有被覆盖,如果是静态变量,静态变量只初始化一次,而且生命周期是是全局变量的生命周期,作用域是该函数内。那么他的值不会变,当是这样的变量时才用传 引用返回。
5.引用作为函数形参的优点比起传值返回,效率更快。
6.内敛函数,与宏的区别,宏麻烦,抽象不好理解
#define add(x,y) ((x)+(y))
这是宏定义写出来的俩数相加,
用c++的内敛函数可以这样写
#incline int add(int x,int y)
{
return x+y;
}
这就是内敛函数可以直接在函数里面展开作用和宏一样但是更加简单容易理解
这是一种以空间换取时间的做法,当内敛函数代码超过10行时一般就不采用宏展开,而是在汇编中经行call指令,为函数开辟栈帧 内联函数不适用与递归函数,而且因为没有符号表的原因他的声明和定义不能分开写,必须写在一起。
swap函数的函数是引用和指针的时候都是在底层都是一样的