一 什么是引用?
引用引入了对象的一个同义词。定义引用的表示方法与定义指针相似,只是用&代替了*。引用(reference)是c++对c语言的重要扩充。引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明方法:类型标识符 &引用名=目标变量名;
二 引用说明
(1)&在此不是求地址运算,而是起标识作用。
(2)类型标识符是指目标变量的类型。
(3)声明引用时,必须同时对其进行初始化。
(4)引用声明完毕后,相当于目标变量名有两个名称,即该目标原名称和引用名,且不能再把该引用名作为其他变量名的别名。(有点类似与linux中的硬链接)
1
2
3
4
5
6
7
|
void swapint( int *a, int *b)
{
int temp;
temp=*a;
*a=*b;
*b=temp;
}
|
1
2
3
4
5
6
7
|
void
swapint(
int
&a,
int
&b)
{
int
temp;
temp=a;
a=b;
b=temp;
}
|
四 函数返回引用:
(1) c++返回引用时没有对返回值进行复制,而是返回对象的本身。
int& Test::func(int &a)
{
cout<<"this is a Test program"<<endl;
return a;
}
以上示例返回的是引用,对a来说,函数执行结束之后并没有将a进行复制,而是直接返回传进来的a本身。
也正是因为这样,返回引用可以提高效率,因为在函数调用结束时不需要将返回值复制。
(2 )当一个函数需要返回引用时,必须在其参数列表中包含以引用或者指针形式存在的并且需要返回的参数,而不能直接返回局部对象。
错误示例:
Test& Test::func(int &x)
{
cout<<"this is a Test program"<<endl;
Test tt;
tt.a=9;
return tt;
}
在linux环境下执行结果为:段错误。
正确示例:
Test& Test::func(Test &tt)
{
cout<<"this is a Test program"<<endl;
tt.a = 123456;
return tt;
}
在linux环境下执行结果:
this is a test program
123456
我的理解,引用的表面现象就是给变量起了一个别名,这个别名和它的真名都是指向同一个变量,操作任何一个效果都一样,都是对这个变量进行操作,本质上就是把变量的指针复制了一份,然后用一个新的变量(别名)存储起来。
参考链接:https://baike.baidu.com/item/C%2B%2B%E5%BC%95%E7%94%A8