1.什么是引用
引用是为对象起的另外一个名字,定义的格式为: 类型 &引用变量名 = 已定义过的变量名。例如:
int a=10;
int &b=a; //b是a的引用
2.引用的特点
1>一个变量可取多个别名
2> 引用必须初始化
3>引用只能在初始化的时候引用一次,不能改变为再引用其他的变量。
定义引用时,程序会把引用的它的初始值绑定在一起,一旦初始化,引用将和它的初始值对象一直绑定在一起,所以无法再引用其他变量,且必须初始化。
3.几种特殊的引用
1>引用一个引用变量
实际上相当于给别名再次起了一个别名
2>const引用
被const修饰的引用相当于一个常量
void Test ()
{
int d1 = 4;
const int & d2 = d1;
d1 = 5; // d1改变 d2的值也会改变。
//d2 = 6; // 错误。不能给常量(不能被修改的量)赋值
} 有且只有被const修饰的引用可以引用一个常量
void test()
{
const int & d= 5; // 常量具有常性,只有常引用可以引用常量
} 被const 修饰的 int类型的引用可以引用一个double类型的数据,但是会丢失数据。如果不用const修饰,则编译器会报错。
void test()
{
double d7 = 1.1;
//int& d8 = d7; //错误,d7是double类型,d8是int,d7赋值给 d8时要生成一个临时变量,也就是说d8引用的是这个带有常性的临时变量,所以不能赋值。
const int& d9 = d7;
}
3>引用作为参数
引用作为函数参数可以直接在函数内部改掉传进来的实参的值,非常方便。
void Swap (int& left, int& right)
{
int temp = left;
right = left ;
left = temp ;
} //通过引用改掉了传进来的实参值
如果不希望改掉实参的值,尽量使用常引用传参
4>引用作为返回值
引用作为返回值时,一定要注意不能返回临时变量的引用。临时变量的引用在返回时,系统会将临时变量的地址放到寄存器中(感兴趣为什么是这样的话可以尝试看一下对应的汇编代码),所以相当于返回了临时变量的地址,如果那块空间没有被占用的话结果是对的,但这只是一种侥幸正确的情况,一旦空间被占用,结果将变成一个随机值。
<span style="font-weight: normal;"><span style="font-size:10px;">#include<iostream>
using namespace std;
int& Add(int d1, int d2)
{
int ret = d1 + d2;
return ret;
}
void main()
{
int a = 3, b = 4;
int c = Add(a, b);
cout << "c:" << c << endl; //结果虽然正确,实际上已经发生了错误。
}</span></span>
总结:
学习引用,我们会发现,它貌似和指针很相似,那么它和指针有哪些区别呢?
1>引用只能在定义时初始化一次,之后不能改变指向其它变量(从一而终);指针变量的值可变。
2> 引用必须指向有效的变量,指针可以为空。
3>sizeof指针对象和引用对象的意义不一样。sizeof引用得到的是所指向的变量的大小,而sizeof指针是对象地址的大小。
4> 指针和引用自增(++)自减(--)意义不一样。
5> 相对而言,引用比指针更安全。
指针比引用更灵活,但是也更危险。
转载请注明原文地址: https://ju.6miu.com/read-1298178.html