c++学习笔记 --引用

引用的概念:

      建立引用的作用是为变量另起一个名字,变量的应用通常被理解为是变量的别名。当声明了一个引用时,必须同时用另一个变量名来对它初始化,即声明它代表哪一个变量,是哪一个变量的别名。这样,对一个引用的操作就是对这个变量的操作。可以理解为一个人在互联网上又很多昵称,但它们都代表着这一个人,它们所做的行为也代表这个人的行为。

 引用目前有三种用法:直接成为一个变量的引用;引用作为函数参数;引用作为返回函数值。

数据类型 & 引用名=已定义的变量

例如:

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;
  }
}

虽然两者结果一样,但是后者比前者代码要繁琐。所以不难看出合理使用引用带来的简便。

写在最后:

第一次写博客,可能在表述上存在不清,对有些东西的理解可能不深刻不正确。作为对知识的学习和再理解,有不足之处欢迎大家指出,感谢观看。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值