引用的概念:
建立引用的作用是为变量另起一个名字,变量的应用通常被理解为是变量的别名。当声明了一个引用时,必须同时用另一个变量名来对它初始化,即声明它代表哪一个变量,是哪一个变量的别名。这样,对一个引用的操作就是对这个变量的操作。可以理解为一个人在互联网上又很多昵称,但它们都代表着这一个人,它们所做的行为也代表这个人的行为。
引用目前有三种用法:直接成为一个变量的引用;引用作为函数参数;引用作为返回函数值。
数据类型 & 引用名=已定义的变量
例如:
int a=6;
int & pr=a; //声明pr是整形类型的引用,用a对它初始化。
这里的a也即是pr,它们代表的意义都相同。
其中的&代表引用声明符,而不是取地址符,要判断&代表的是什么很简单。已知“=”的左右值代表的意义不同。左值可以寻址,右值不行;左值可以被赋值,右值不行;左值可变,右值不行。“&”出现在右边时就是取地址,出现在左边时就是引用。
所以,当a变化时pr也变化,反之亦然。
我们可以通过一个交换函数就能明白。
交换两个变量的值通常使用的传址调用。这里用引用的方式也可以起到相同的效果。
void swap(int *m,int *n) //指针变量作为函数参数例子
{
int temp;
temp= *m;
*m= *n;
*n=temp;
}
void O_swap(int &m, int &n) //引用变量作为函数参数例子,也是引用的第二种用法
{
int temp;
temp=m;
m=n;
n=temp;
}
int main()
{
int a=2;
int b=3;
swap(&a,&b); //传址
cout<<a<<" "<<b<<endl;
O_swap(a,b); //传值
cout<<a<<" "<<b<<endl;
return 0;
}
从运行结果中可以看出两次交换都能成功实现。需要明白的是,指针是通过地址间接访问变量,引用时通过别名直接访问某个变量。
需要注意的是:
(1)引用仅在声明时才带引用运算符“&”,以后出现就跟普通变量一样,不能再带“&”,其他场合使用都是取地址运算符。
(2)引用可以使用任何合法的变量名。在申明引用时必须同时赋予初始变量,不能先声明再赋值(除用作函数参数或变量类型外)。
例如:
int a;
int &j;
j=a;
(3) 给引用赋予的初始值可以是变量,也可以是引用。
例如:
int a;
int &j=a;
int &i=j;
(4)引用在初始化后不能再声明为另一个变量的引用。
例如:
int a,b; //a b为整形变量。
int &c=a;
c=&b;
你可以把变量当作你本人,引用则是你互联网的各种社交账号,你的社交帐号可以有很多个,但是它们的实名认证只能是你本人。
(5)以下情况的引用声明都是不合法的
1.void 类型的引用不允许。void只是在语法上认为空的意思,本质上不是类型。
2.不允许引用数组的建立。
例如:
int a[5]="1abcd";
int &t[5]=a;
3.不允许出现引用的引用和指向引用的指针。
例如:
int a;
int &&p=a; //引用的引用
int &*r=a; //指向引用的指针
(6) 可以用指针指向引用的地址。
例如:
int a=6;
int &b=a;
int *c=&b;
此时指针指向原来的变量。
使用引用返回函数值
使用这种方法可以将函数调用放在赋值运算符的左边。
//使用引用返回函数值
#include<iostream>
using namespace std;
int arry[4]={1,2,3,4};
int &index(int i) //声明函数返回一个整型类型的引用
{
return arry[i];
}
int main()
{
index(2)=100; //改变下标为2的值
for(int i=0;i<4;i++)
cout<<index(i)<<" "; //目前数组的内容
cout<<endl;
index(2)=50; //再次改变下标为2的值
for(int i=0;i<4;i++)
cout<<index(i)<<" "; //目前数组的内容
return 0;
}
如果把函数定义改为:
int index(int i)
{
return arry[i];
}
编译语句“index(2)=100”时将会出错。作为普通函数一般放于赋值运算符的右侧。
对引用的综合理解
比较两个数,将较大的数赋为1
#include<iostream>
using namespace std;
int &max(int &m ,int &n)
{
return (m>n)?m:n;
}
int main()
{
int a,b;
cout<<"请输入两个值";
cin>>a>>b;
max(a,b)=1; //找到最大值并把最大值改为1
cout<<"a="<<a<<" "<<"b="<<b<<endl;
return 0;
}
如果不使用引用返回函数值功能,max(a,b)=1就不能一步完成。
//max函数的其他写法
int max(int m ,int n)
{
if(m>n)
{
m=1;
return m;
}
else
{
n=1;
return n;
}
}
虽然两者结果一样,但是后者比前者代码要繁琐。所以不难看出合理使用引用带来的简便。
写在最后:
第一次写博客,可能在表述上存在不清,对有些东西的理解可能不深刻不正确。作为对知识的学习和再理解,有不足之处欢迎大家指出,感谢观看。