一、什么是引用?
引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它
引用的变量共用同一块内存空间。
比如:李逵,在家称为"铁牛",江湖上人称"黑旋风"。
类型& 引用变量名(对象名) = 引用实体;
void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
printf("%p\n", &a);
printf("%p\n", &ra);
}
在这里,a和ra其实指向同一空间,它们的地址是一样的,所以,ra相当于a的别名。
注意:引用类型必须和引用实体是同种类型的
二、特点:
1. 引用在定义时必须初始化!!!
void TestRef()
{
int a = 10;
// int& ra; // 该条语句编译时会出错
int& ra = a;
int& rra = a;
printf("%p %p %p\n", &a, &ra, &rra);
}
2. 一个变量可以有多个引用
void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
int& rra=ra;
int& rrra=rra;
printf("%p\n", &a);
printf("%p\n", &ra);
}
3. 引用一旦引用一个实体,再不能引用其他实体
void TestRef()
{
int a = 10;
int& ra = a;//<====定义引用类型
int b = 100;
ra = b;//这句代码是指把b赋值给ra,引用是从一而终的,一旦引用就定了,不能在引用别的变量
printf("%p\n", &a);
printf("%p\n", &ra);
}
三、常引用
下图代码里,a,b都是 const 类型的,所以必须用 const 的引用 。在引用时,权限可以缩小,不可以放大。
void TestConstRef()
{
const int a = 10;
//int& ra = a; // 该语句编译时会出错,a为常量,具有常属性,不可修改
const int& ra = a;
// int& b = 10; // 该语句编译时会出错,b为常量
const int& b = 10;
int c =20;
const int& rc = c;//正确
double d = 12.34;
//int& rd = d; // 该语句编译时会出错,在编译时,d先给一个临时变量,临时变量再给rd,但是该临时变量具有常属性,即不可修改,所以错误
const int& rd = d;//加上const即正确
}
四、引用的作用(使用场景)
1.做参数
void Swap(int& left, int& right)
{
int temp = left;
left = right;
right = temp;
}
2.做返回值
int& TestRefReturn(int& a)
{
a += 10;
return a;
}
注意:如果函数返回时,离开函数作用域后,其栈上空间已经还给系统,因此不能用栈上的空间作为引用类型返回。如果以引用类型返回,返回值的生命周期必须不受函数的限制(即比函数生命周期长)。