c++中的引用
可以理解为给变量取别名,也就是说给一个变量有起了一个别的名称,这个引用变量和原来的变量共用一个地址。用一个简单例子说明一下:有一个人叫张三
,他的脸比较长,所以同学叫他驴哥
,在家中排行老二,所以母亲叫他二宝
。无论是叫驴哥还是二宝,他还是张三。引用就是这样,给一个变量起外号,还能起多个外号,但本质还是原来的变量。
一,引用的使用规则
- 引用在定义时必须初始化
- 一个变量可以有多个引用
- 引用不能重复
int main()
{
int a=10;
//给a取别名,可以有多个别名
int& b=a;//定义时初始化
int& c=b;
int& d=c;
return 0;
}
上面的代码给变量a取了三个别名b,c,d。我们可以看看它们的地址是否一致?
从这里可以看到,地址是一样的。
引用的形式为变量类型+&+别名=真名(别名)。可以给别名再起别名,这有点套娃的意思了。
二,引用的应用
引用
一般有两方面的用途:
- 做函数参数
- 做函数返回值
1.做函数参数
引用在应用时,有点类似于指针,但是指针使用起来是比较复杂的,相信野指针困扰了很多同学,但要是用引用就很舒服了。
引用和指针都可以做函数参数:
- 引用不会出现空引用,指针有空指针的非法访问
- 引用连接的地址绝对是合法的,指针可能是野指针,地址非法
- 引用只能被初始化为一个对象,指针可以指向任意地址
所以综上,引用是更安全的,但是指针也有很多引用不能完成的操作。
做函数参数
,我们都知道传过去的函数参数,有传值,传地址两类。
(1)传值是简单的,函数的参数就是一份临时拷贝,它不能够改变原来参数的值。
(2)传地址,可以改变地址指向的内容。
(3)传引用,可以改变引用变量所引用的原变量。
举个例子: 简单些,就是交换两变量的值,可以用指针也可以用引用。
#include<iostream>
using namespace std;
void swap(int& c, int & d)
{
int tmp = c;
c = d;
d = tmp;
}
int main()
{
int a = 1;
int b = 2;
cout<<"a和b本来的值"<<endl << a <<endl<< b << endl;
swap(a, b);
cout << "a和b交换后的值" << endl << a << endl << b << endl;
return 0;
}
运行结果如下:
2.做函数返回值
做函数返回值是有些不好理解的,而且用的时候也会频繁出错。
首先讲讲引用做返回值的条件:
函数返回时,函数的返回对象还没还给操作系统,就可以用引用
返回,否则只能用传值返回。
讲讲这个条件的原因:
函数是占用栈的空间的,在函数调用结束时,函数会销毁,将空间返回给栈。如果返回的变量是个临时变量,那么就不能用引用返回,因为引用返回的对象就是其本事,不能够返回一个已经还给操作系统
的变量,这是不安全的行为。比如返回对象是个全局变量或者加上static的临时变量,这是可以用引用返回的。
#include<iostream>
using namespace std;
int& add(int x, int y)
{
static int c = x + y;
return c;
}
int main()
{
int ret = add(1, 2);
cout << ret<<endl;
}
我们需要注意
一点,引用返回,返回的是返回对象本身。这点很重要,可能大家觉得这点挺好理解,其实不然,一般情况下的函数返回,返回的并不是返回对象本身,而是返回对象的临时拷贝,有两种情况:
- 如果返回对象较小,那么会临时拷贝到寄存器里
- 如果返回对象较大,那么会拷贝在函数栈帧中
总结一下:函数引用返回,直接返回,返回对象本身,其实节省了空间。但是返回对象,出了函数还必须存在,如果还给操作系统了,就不能用引用返回。
以上就是本期内容,希望对大家有所帮助。