浅谈C++的常引用
来源:互联网 发布:linux修改vim配置 编辑:程序博客网 时间:2024/05/15 09:23
引用是我们在编程中经常遇到的东西,下面我们从普通的引用入手来浅谈C++常引用的一些优点和用途。
首先,我们先看一下最普通的引用:
<span style="font-size:18px;">#include<iostream>using namespace std;int main(){int a=1;int hengbao=5;int &b=a;b=hengbao;cout<<b;return 0;}</span>我们发现引用是可以随时变换指向的,就像普通的指针一样,在这一行是指向a的,可能下一行就指向b了。
但是如果我们这样写:
#include<iostream>using namespace std;int main(){int a=1;int hengbao=5;const int &b=a;b=hengbao;cout<<b;return 0;}
就会出现这样的错误,这就是常引用的第一个特点:如指针常量一般,初始化后便不可再改变指向。
那么,这玩意儿有什么用呢?
用途一:用作函数形参,接受“各类”数据
常变量不能传递给形参是普通引用的函数,但如果函数形参是常引用,那么无论普通变量还是常变量都可以传递给函数,因为非const引用可以匹配const引用。
例如我们做一个得到两个数中最大的一个数的函数
#include<iostream>using namespace std;int findMax(const int &a,const int &b){return a>=b?a:b;}int main(){int a=1;const int b=2;int c=findMax(a,b);cout<<c;return 0;}
它的运行效果如下:
当然了,我们的常引用也可以接受一些“临时的变量”,这也是它强大的一个地方:
#include<iostream>using namespace std;int FindMax(const int &a,int &b){return a>=b?a:b;}int main(){int a=1;const int b=2;int d=FindMax(a,5);//错误cout<<c;return 0;}
会出现如下的错误提示
当然了,我们的常引用可以顺利完成求最大:
#include<iostream>using namespace std;int findMax(const int &a,const int &b){return a>=b?a:b;}int main(){int a=1;const int b=2;int c=findMax(a,5);cout<<c;return 0;}
效果如下图
用途二:用作返回值类型。
首先我们先辨析一些返回值类型为引用与指针的区别。当返回值类型为引用时,我们只是给变量起了一个别名,并不占用实际的内存空间。但是当返回值类型为指针是是需要开辟内存空间存储指针的。也就是说引用并不是自力更生的,而是类似于寄生的。
所以返回引用必须是有意义的,例如返回全局变量,返回形参里带引用的变量……(返回局部变量的引用是十分不明智的,也是不允许的)
当我们希望返回的对象不被改变,我们就可以为它加一个const,这样,我们的返回常引用就出现了。下面我们举例说明一下:
如果我们需要找出两个数中较大的数,然后仅仅是显示出来,不再对这个数进行任何操作,就可以这样写:
#include<iostream>using namespace std;const int& findMax(int &a,int &b){return a>=b?a:b;}int main(){int a=1;int b=2;const int c=findMax(a,b);return 0;}
如果我们需要更改最大值,比如为它加一,我们就可以这样写:
#include<iostream>using namespace std;const int& findMax(int &a,int &b){return a>=b?a:b;}int main(){int a=1;int b=2;int c=findMax(a,b);c++;return 0;}
但是,我们知道返回引用或者返回值也是可以的呀,但是,下面这段代码就可以体现它的安全性了:
#include<iostream>using namespace std;int c=0;const int& findMax(int &a,int &b){c= a>=b?a:b;return c;}int main(){int a=1;int b=2;int &c=findMax(a,b);return 0;}
会报出这样的错误:
也就是说,额外的,你再想改变我c的值是不可能的,但是返回引用是不能禁止改变c的值的。
比如:
#include<iostream>using namespace std;int c=0;int& findMax(int &a,int &b){c= (a>=b?a:b);return c;}int main(){int a=1;int b=2;int &d=findMax(a,b);d++;cout<<c;return 0;}
这时,结果是这样的:
- 浅谈C++的常引用
- 对象的常引用
- 常引用的作用
- 对象的常引用
- C++(常)引用,const,指针引用
- 常引用、静态常变量的例子
- 对象的常指针和常引用
- 常引用、常对象、对象的常成员
- C++对象的常引用
- 常引用的链接地址
- 常引用,const CString&,引用的效率
- 常引用
- 常引用
- 常引用
- 有关C++中的常对象,常成员函数,常数据成员,常引用的认识
- C/C++日常学习总结(第七篇)常引用&指针的理解
- 对象数组,对象指针,常对象、对象的常引用
- 常对象常引用等的一些理解
- 11
- 刚才写代码遇到一个很不起眼的bug, 火眼金睛的猿们来看看吧
- CentOS 构建LAMP
- 栈区,堆区,常量区,静态区代码区
- 【网络安全】802.1X技术基础
- 浅谈C++的常引用
- ++i 与 i++ 四种层次认知
- Web应用解决中文乱码的两种方式
- javax.servlet.ServletException: BeanUtils.populate
- nyoj107&&hdu A Famous ICPC Team
- IOS将GPS定位经纬度转换为高德地图经纬度
- 新版RE管理器 (Root Explorer)修改方法(去广告,时间日期排序,默认文件夹优先)
- Linux/Ubuntu学习笔记(七)--MySQL安装
- poj1837 balance