前言
暂时告别了C语言中令人头痛的指针,在C++中的引用与C中的指针很类似,但是二者存在着差别。
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是C++对C语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名。
举个例子来讲吧,假如有个叫张三的同学,在C语言中,张三这个名字就是指针,而张三这个名字指向了那个同学,换句话来说,张三这个名字是个地址,而这个地址指向了叫张三的同学这个实体内容;而在C++中的引用则不同,张三这个名字,也是指向了这个名字叫做张三的同学,那么在外面这个同学叫张三,回到家里父母、朋友可以叫他的小名或者别名 “ 三三 ”,二者指向了同一个实体(叫的是同一个人),所以我们需要叫这个同学的话,我们可以用“张三”也可以用“三三”,因为他们指向的是同一个人(同一个实体)。
我们可以用一个小程序来检测:
#include<iostream>
using namespace std;
int main()
{
int a = 2;
int& b = a;
cout<<&a<<endl;
cout<<&b<<endl;
}
说到这里,我们可以总结下引用的特点,特点具体如下:
1.一个变量可以取多个别名;
2.引用必须初始化;
3.引用只能在初始化的时候引用一次,不能改变为再引用其他变量。
ps:const引用
不能给一个const修饰的变量进行引用。
引用的类型转换
再看一个代码:
int main()
{
double d = 3.14;
int& a = d;
}
结果提示“无法从double转换为int&”,是不是因为a和d的类型不同呢?
其实并不如此,
首先,double转换成int 时,将3.14的值先保存到一个临时空间中(_d),之后&a再指向该临时空间,但是防止对临时空间进行修改,前面应该加上const,
eg:const int& a = d
;
在我们添加了const之后,可以看到只是警告"从double转换到int可能丢失数据”
引用在函数作为返回值
#include<iostream>
using namespace std;
int& Add(int d1,int d2)
{
int ret = d1 + d2;
return ret;
}
void test()
{
int a = 3,b = 4;
int c = Add(a,b);
cout<<"c:"<<c<<endl;
}
结果在生成期间编译器提示“
返回局部变量或者临时变量地址”,这个类似可以理解成返回一个指针,在
函数的调用期间开辟了一块临时空间用于保存临时变量ret,但是在调用结束之后,这块内存释放,但是ret的地址却被作为返回值返回,和野指针一样,已经指向了位置内容的地址。
通过上面代码可以得出一些结论:
1.不要返回一个临时变量的引用,它最后可能成为了一个“野指针”;
2.如果返回对象出了当前函数作用域依旧存在,那么我们可以使用引用作为返回值,因为这样更高效(引用返回地址,值返回变量本身)。
总结
在最后,总结一下引用和指针之间的区别:
1.引用只能在定义时初始一次,之后不能改变指向其他变量,而指针变量值可变;
2.引用必须指向有效的变量,而指针可以为空(NULL);
3.sizeof指针对象和引用对象意义不同,sizeof引用:指向的变量的大小;
sizeof指针:地址大小;
4.指针的自增和自减与引用不同;
5.引用比指针更安全。