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


这时,结果是这样的:


0 0