后台开发:核心技术与应用实践1.5 引用

1.5 引用


1.?引用是什么

对于习惯使用C语言进行开发的朋友们,在看到C++中出现的&符号后,可能会犯迷糊,虽然在C语言中这个符号代表取地址符,但是在C++中它却有着不一样的用途,代表着引用的意思。掌握C++的&符号,有利于增强代码质量和提高代码执行效率。

引用是一种变量类型,它用于为一个变量起一个别名。

引用的声明方法是:

类型标识符 &引用名=目标变量名;

假设有一个变量a,想给它起一个别名r,可以这样写:

int a;

int &r=a;

定义引用r,它是变量a的引用,即别名。经过这样的声明后,a和r的作用都一样,都代表着同一变量。a和r占用内存的同一个存储单元,即具有同一地址。在声明一个引用变量时,必须同时使之初始化,即声明它代表哪个变量。函数执行期间,不可以将其再作为其他变量的引用。例1.9说明了引用的使用方法。

【例1.9】 引用的使用举例。

#include<iostream>

using namespace
std;

int main(){

    int a=2;

    int &r=a;

    a=a+4;

    cout<<a<<"
"<<r<<endl;   // 因为a和r的值会同时变化,所以a和r的值都是6。

    r=10;

    cout<<a<<"
"<<r<<endl;   // r变了,a也会变,所以a和r的值都是10。

    return 0;

}

程序的执行结果是:

6 6

10 10

例1.9中展示了引用与变量的关系。r是a的引用,a变了,r的值也跟着变;r变了,a的值也跟着变。

2.?引用作为参数

引用一个重要的作用就是作为函数的参数。

【例1.10】 引用作为函数的参数举例。

#include<iostream>

using namespace
std;

void Mmin1(int
a,int b){

    int temp;

    if(a>b){

        temp=a;

        a=b;

        b=temp;

    }

}

 

void Mmin2(int
&a,int &b){         // 引用作为函数的参数

    int temp;

    if(a>b){

        temp=a;

        a=b;

        b=temp;

    }

}

int main(){

    int a=30,b=20;

    Mmin1(a,b);                       //

    cout<<a<<"
"<<b<<endl;        // a、b的值保持不变。

    Mmin2(a,b);

    cout<<a<<"
"<<b<<endl;        // a的值是20,b的值是30. a、b的值被修改了

    return 0;

}

程序的执行结果是:

30 20

20 30

例1.10中定义了两个求最小值的函数,其中Mmin1是将一般变量作为函数的参数,Mmin2则是将引用作为函数的参数。

将一般变量作为函数的参数,传给形参的是变量的值,传递是单向的。如果在执行函数期间形参的值发生变化,并不传回给实参。因为在调用函数时,形参和实参不是同一个存储单元。

使用引用传递函数的参数时,在内存中并没有产生实参的副本,而是对实参直接操作。当使用一般变量传递函数的参数时,当函数发生调用,需要给形参分配存储单元,形参变量是实参变量的副本;如果传递的是对象,还将调用拷贝构造函数。因此,当参数传递的数据较大时,用引用比用一般变量传递参数的效率更高,所占空间更少。

使用指针作为函数的参数虽然也能达到与使用引用同样的效果,但是在被调函数中同样要给形参分配存储单元,且需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参,这些都不太方便。

综上所述,引用是个有效率的选择。

3.?常引用

如果既要提高程序的效率,又要使传递给函数的数据不在函数中被改变,就应该使用常引用。常引用的声明方式是:

const 类型标识符 &引用名=目标变量名;

用这种方式声明的引用,不能通过引用对目标变量的值进行修改,在程序中使引用的目标成为const类型,从而保证了引用的安全性,如下所示:

int a;

const int
&r=a;

r=1;           // 错误

a=1;          // 正确

假设有如下函数声明:

string func1();

void
func2(string &s);

那么下面的表达式都是非法的:

func2(func1);

func2("hello");

原因在于func1()和"hello"都将产生一个临时对象,而在C++中,这些临时对象都是const类型的。因此,上面的表达式就是试图将一个const类型的对象转化为非const类型,这是非法的。

引用型参数应该在能被定义成const的情况下,尽量定义为const。

时间: 2024-09-20 06:24:36

后台开发:核心技术与应用实践1.5 引用的相关文章

后台开发:核心技术与应用实践

后台开发:核心技术与应用实践 徐晓鑫 著 图书在版编目(CIP)数据 后台开发:核心技术与应用实践 / 徐晓鑫著. -北京:机械工业出版社,2016.8 ISBN 978-7-111-54339-8 I. 后- II. 徐- III. 网络-开发 IV. TP393.092 中国版本图书馆CIP数据核字(2016)第167884号 后台开发:核心技术与应用实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编辑:李 艺 责任校对:董纪丽 印 刷: 版 次:

后台开发:核心技术与应用实践导读

后台开发:核心技术与应用实践 徐晓鑫 著 图书在版编目(CIP)数据 后台开发:核心技术与应用实践 / 徐晓鑫著. -北京:机械工业出版社,2016.8 ISBN 978-7-111-54339-8 I. 后- II. 徐- III. 网络-开发 IV. TP393.092 中国版本图书馆CIP数据核字(2016)第167884号 后台开发:核心技术与应用实践 出版发行:机械工业出版社(北京市西城区百万庄大街22号 邮政编码:100037) 责任编辑:李 艺 责任校对:董纪丽 印 刷: 版 次:

Android开发:优化ListView实践解析

 在看了一些vogella的文章之后,发现关于android listview性能优化这一段很有意思,于是实践了一下,经过优化,性能确实提升不少! 先看看优化前和优化后的比较: 优化前的log截图: 开发:优化ListView实践解析-"> 优化后的log截图: 并且,在不停滚动ListView的过程中,优化之前会出现ANR现象,在AVD上特别容易复现: 然后,优化后显得很流畅,附上对于的log截图: 下面附上相关代码分析: ListView中的每一个Item由一个ImageView 和一

android-Android后台开发相关书籍资料

问题描述 Android后台开发相关书籍资料 Android APP后台搭建过程,如何使用开发语言实现,请推荐相关书籍,谢谢. 解决方案 <第一行代码> <疯狂Android讲义> <Android群英传> <Android开发艺术探究> 解决方案二: 后台开发相关书籍Android各层开发推荐书籍及资料(转)Android相关开发资料汇总 解决方案三: http://www.jikexueyuan.com/course/2208.html 解决方案四: 深

mysql-app后台开发,如何做好安全性?

问题描述 app后台开发,如何做好安全性? app后台开发一枚,现在要对整个项目做一些安全性,比如拦截非法请求,sql注入什么的 后台开发技术:spring + mybatis + mysql 求一些思路.麻烦了. 解决方案 比如检查密码的sql语句一定要处理特殊字符? = ' 等等,最后还是要写file.将你所设想到的情况全写下来.后期安全还有问题再添加. 解决方案二: 最好安卓请求时要带上自己的用户信息 解决方案三: 接口的话,多加一些加密处理了,然后在登录的时候带token,再就是服务器的

linux 后台开发-后台开发需要些什么东西

问题描述 后台开发需要些什么东西 我是一名大三的学生,想做后台开发,但是又不知道该从哪方面做起.目前Linux c/c++都学的不错,数据结构也学过,SQL.socket网络通信也学过,TCP/IP协议也有一定了解,然后,下一步不知道该干嘛了,我觉得自己学的这些东西比较基础,都不知道怎么怎么能把它们应用实际.望各位大牛能指点迷津 解决方案 这看你想做哪方面的了.linux服务器开发维护,数据库开发维护,网站后台web开发(javawebphp.net等) 解决方案二: 你所学的仅仅是基础,多看看

Linux 后台开发工作中常用的开源库

后台开发,语言主要是 c 和 c++ , 这里简单罗列一下工作中用的很频繁的那些开源软件 1. OpenSSL openssl OpenSSL 是一个安全套接字层密码库,囊括主要的密码算法.常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用. 下载地址: https://www.openssl.org/source/ 2.TinyXML tinyxml 简单,高效,灵活的一套操作 XML 文件的开源库. 下载地址: http://www.grinninglizar

javascript-App后台开发用哪种语言

问题描述 App后台开发用哪种语言 我想问开发一个APP的后台,想实现的功能有实时聊天,图片,视频的上传和下载等, 用java写好,还是其他的好 解决方案 java.php.python.c++.....很多,建议使用java,轮子多,效率高,也可以用python,简单,效率也不低 解决方案二: 后台有很多选择,如果你熟悉android,那么当然选java,那是你熟悉的语言,如果你熟悉js,可以用node.js,其它的语言还有C# VB PHP Ruby Python Go ... 解决方案三:

ios-iOS APP后台开发技术问题请教

问题描述 iOS APP后台开发技术问题请教 如果要搭建一个IOS应用(假设用户量为几十万)的后台服务器,现在比较靠谱的后台架构是怎样的? (先说说我现在的理解,之前做过一些Android开发的事情,当时后台是写了一个简单的Http服务器(利用Netty实现),然后前端和后台的数据交换采用json实现,至于服务器硬件的配置等等没有过考虑.所以我现在可以认识到的后台,就是HTTP请求+Json返回数据.) 想请教一下各位:从服务器硬件到操作系统再到后台技术框架,有没有一个比较系统.成熟.可靠的模式

Java后台开发精选知识图谱

引言: 学习一个新的技术时,其实不在于跟着某个教程敲出了几行.几百行代码,这样你最多只能知其然而不知其所以然,进步缓慢且深度有限,最重要的是一开始就对整个学习路线有宏观.简洁的认识,确定大的学习方向,这样才能事半功倍. 我们经常会遇到这样的情况: 一开始学习一门新技术的时候,面对着很多很多陌生的名词,无从下手,一度想要放弃. 本文首先会给出关于java后台开发和前端适配的一些建议学习路线,接着简单解释一些应用到的高频技术,帮助大家理解和学习,算是一个入门篇. Java后台开发知识一览 1.后端