引用:
{
int temp = l;
l = r;
r = temp;
}
{
int temp = l;
l = r;
r = temp;
}
{
int a = 10;
int b = 20;
swap(&a, &b);
system("pause");
return 0;
}
{
int temp = *l;
*l = *r;
*r = temp;
}
{
int temp = l;
l = r;
r = temp;
}
const修饰的引用:
无法用 "double" 类型的值初始化 "int &" 类型的引用(非常量限定).
但是加上const,如下:
double d = 0.0;
00815C98 movsd xmm0,mmword ptr ds:[81DBB0h]
00815CA0 movsd mmword ptr [d],xmm0
const int &a = d;
00815CA5 cvttsd2si eax,mmword ptr [d]
00815CAA mov dword ptr [ebp-28h],eax
00815CAD lea ecx,[ebp-28h]
00815CB0 mov dword ptr [a],ecx
const double &a = d;
00C65C98 movsd xmm0,mmword ptr ds:[0C6DBB0h]
00C65CA0 movsd mmword ptr [d],xmm0
const double &a = d;
00C65CA5 lea eax,[d]
const double &a = d;
00C65CA8 mov dword ptr [a],eax
引用大小:
一个引用的大小与它所引用的对象的类型有关。
例如前一个例子中的引用:const double &a= 0; 那么sizeof(a)的大小将会是sizeof(double)的大小,在32位平台上,这个值是8。
引用作为返回值:
- int & fun()
- {
- int a = 10;
- return a;
- }
比如我们再main函数中这样调用这个函数:int &b = fun();
有没有问题?仔细想想,可以发现,变量a的空间是在属于fun函数的栈桢上开辟的,变量a在fun函数返回后被销毁,此时它的值不在有效,也不能保证其值不变,返回这个变量的引用,相当于返回了栈空间的地址,那么b所引用的空间已被释放,它的值将会变得不可预料。当然指针的使用中也存在这样的错误例子(返回了栈空间地址)。
我们换个方式接受一下函数的返回值:int b = fun(); 这样依旧会存在一定的问题,函数的返回值是个引用(底层实现为指针),而函数返回值是通过寄存器实现的,则函数调用完成后,变量a的地址将被保存到寄存器中用以返回,然后函数栈桢销毁,再把这个地址的值赋给变量b。在此过程中也不能保证a所在空间的内容不发生改变,所以依旧有错。