您的位置:首页 > 其它

引用

2016-01-23 21:57 204 查看

概念

引用可以看做一个已定义变量的别名

引用的语法 Type& name = var;

引用代替指针

//引用
int swap1(int& a,int& b)
{
int t;
t = a;
a = b;
b = t;
}
指针
int swap2(int* a,int* b)
{
int t;
t = *a;
*a = *b;
*b = t;
}


效果一样但是显然引用更好用些

const引用(重要)

形式:const Type& name = var;

c++工程

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
const int a = 1;//常量
const int& b = 1;//只读变量
int *pa = (int*)&a;
int *pb = (int*)&b;

*pa = 10;//修改常量
*pb = 10;//修改变量
printf("a = %d\n",a);
printf("b = %d\n",b);

return 0;
}


得到的结果是a =1,b = 10;

C工程

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
const int a = 1;
int *pa = (int*)&a;
*pa = 10;
printf("%d\n",a);
return 0;
}


输出结果a = 10

结论:C++中const int a = 1;,中的a是只读常量,存在符号表中,而C中的a为只读变量,在C++中要定义只读变量得定义成const int& a = 1;

引用占用的空间(引用本质)

考虑以下代码:

#include <stdio.h>
struct TRef
{
int& a;
int& b;
};

int main(int argc, char *argv[])
{
printf("sizeof(TRef) = %d\n", sizeof(TRef));
getchar();
return 0;
}


在32位机中,一个引用占用4个字节,

重要:C++在编译过程中使用常指针作为引用的内部实现,所以 int& name <=> int* const name

函数返回值为引用

1. 若返回栈局部变量(栈变量):

*不能成为其他引用的初始值,(函数结束后栈变量被释放,再给被释放发的地址取别名显然没有意义)

*不能作为左值使用(同理)

若返回静态变量或全局变量

*可以成为其他引用的初始值

*可以作为右值也可作为左值

#include <stdio.h>
int& f()//返回静态变量
{
static int a = 0;
return a;
}
int& g()//返回局部变量
{
int a = 0;
return a;
}
int main()
{
int a = g();
int& b = g();
f() = 10;//引用可以出现这种形式的赋值
printf("a = %d\n", a);
printf("b = %d\n", b);
printf("f() = %d\n", f());

getchar();
return 0;
}


输出:a = 0,b = -2,f() = 10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: