什么是引用

引用变量是已定义变量的别名。

如何定义引用变量:

  int rats;

  int & rodents = rats;

其中&不失地址运算符,而是类型标识符的一部分。就行声明char*是指的是指向char的指针一样。

int &指的是指向int的引用。

引用看起来和指针很类似,但是还是不太一样的。

很重要一点:引用必须在声明引用时将其初始化!!

int rat;

int & rodents;

rodent =rat;  // 这样是错误的;

为什么要这样规定?

这是因为引用其实是一个const指针;const变量的特点就是在声明的时候当然得初始化啦,一旦初始化完毕就不能修改。

也就是说引用一旦跟某个变量关联起来,就一直效忠于它,在引用变量的整个生命周期里。是不是很专一?

所以:int & rodents =rats;

实际上是以下代码的伪装表示:

int * const pr =&rats;

引用可以用来做什么?

1)引用可以用来做函数的参数

1 void swapr(int & a, int & b)
2 {
3     int temp;
4     temp = a;
5     a = b;
6     b = temp;
7 }

当使用按引用传递参数的时候,类似于按指针传递参数(C++中大多用按引用传递取代按指针传递了)。

函数的形参可以直接对原始变量(实参)进行操作了,而不是在函数中产生原始变量实体的副本。

一般按值传递参数时,要给形参分配内存空间,形参变量就是原始变量(实参)的副本。

对于大块数据而言,按值传递的内存开销比较大,效率也比较低下。

而采用按址传递(按引用和按指针)可以避免大块的数据全部压入栈中。

2)常引用

在普通引用定义前面加一个只读标识符const。

1 double refcube(const double & ra)
2 {
3     return ra * ra * ra;
4 }

这样做的目的是可以定义一个变量的只读别名,而不用担心变量的值被别名意外地改掉。

3)引用作为函数返回值

为什么要返回引用?答案:效率会更高!

返回引用和传统返回机制的不同之处;

double m = sqrt(16.0);

cout << sqrt(25.0);

第一条语句中,值4.0被复制到一个临时位置,然后被复制给m。

在第二天语句中,值5.0倍复制到一个临时位置,然后被传递给cout

dup = accumulate(team,five);

如果accumulate()返回一个结构,而不是指向结构的引用,将把整个结构复制到一个临时位置,再将这个拷贝复制给dup。

但在返回值为引用时,将直接把team复制到dup,其效率更高。

引用作为函数返回值时需要注意:

const free_throws & clone2(free_throws & ft)
{free_throws newguy;    //first step to big errornewguy =ft;return newguy;
}

  不能返回指向局部变量的引用,局部变量在被调用函数返回后就被销毁掉了。那么它返回的引用所指向的内存已经没有任何意义,运行时会出现不可预知的错误。所以以上代码是错误的。

正确的操作如下:

1 free_throws & accumulate(free_throws & target, const free_throws & source)
2 {
3     target.attempts += source.attempts;
4     tartget.made += source.made;
5     set_pc (target);
6     return target;
7 }

有的时候为了避免在设计中添加模糊的特性,因为模糊的特性增加的犯错的机会。

所以还可以将返回类型声明为const引用。返回类型是不可修改的左值,以下语句就不合法了:

accumulate(dup, five) = four;  //not allowed

转载于:https://www.cnblogs.com/grooovvve/p/10117645.html

C++_引用变量探究相关推荐

  1. 动态改变标题_插入控件-gt;引用变量-gt;实现动态图表纵横筛选

    欢迎关注我的微信公众号:HR爱玩儿Excel和PPT,分享有趣又有逼格的Excel和PPT创意和技巧,emmm...不关注也没有关系...哼 昨晚没睡好,因为睡前老友跟我说了句话: 我们总部做的表没有 ...

  2. php zval_copy_static_var(),zval _ 引用计数 _ 变量分离 _ 写时拷贝

    zval.引用计数.变量分离.写时拷贝 我们一步步来理解 1.php语言特性 PHP是脚本语言,所谓脚本语言,就是说PHP并不是独立运行的,要运行PHP代码需要PHP解析器,用户编写的PHP代码最终都 ...

  3. java数组变量_关于java 的数组引用变量

    在main方法中定义的数组引用变量在其他方法中不能用啊,程序如下,总是出现"找不到符号的错误",那位高手该分析一下啊(其它的三个类我已经定义了)/***@(#)MultiMedia ...

  4. yaml引用变量_合并当前数据

    1.& 锚点和 * 别名,可以用来引用,其中`&` 用于定义变量, `*` 用于引用变量, `<<` 表示合并到当前数据. 案例1:引用变量 # test.yaml 文件内 ...

  5. JavaScript高级day01-AM【WebStrom安装、数据类型分类及判断、数据-内存-变量、引用变量赋值、对象的组成】

    笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目   录 P1 01.尚硅谷_JS高级_准备 07:07 WebStrom 下载及安装 1 ...

  6. C++新特性探究(13.6):右值引用再探究

    相关博文: C++新特性探究(十三):右值引用(r-value ref)&&探究 C++新特性探究(十六):move constructor移动构造 C++新特性探究(13.5):右值 ...

  7. JS高级程序设计读书笔记(第五章 引用变量)

    第五章 引用变量 Object 创建 Object 实例的方式有两种.第一种是使用 new 操作符后跟 Object 构造函数,另一种方式是使用对象字面量表示法. var person = new O ...

  8. C++对C语言的扩展_引用

    在上一篇文章中,我们讲述了c++对c语言的加强,在这篇文章中,我们开始学习c++对c语言的扩展_引用 引用 变量名 变量名实质上是一段连续存储空间的别名,是一个标号(门牌号). 通过变量来申请并命名内 ...

  9. java语言中的合法的变量名_合法的变量名

    展开全部 变量可以通过变量名访问.在指令式语言中,变量通常是可变的:但在纯函数式语言(如Haskell)中,变量可能是e68a8462616964757a686964616f3133343365666 ...

最新文章

  1. dedecms织梦系统后台验证码图片不显示的解决方法
  2. 《Python Cookbook 3rd》笔记(3.12):基本的日期与时间转换
  3. linux文件大小和目录,查看Linux目录和文件大小
  4. node.js编写网页_为Node.js编写可扩展架构
  5. android 4.4.4版本拍照预览,在Android5.1及以下版本的手机上无法预览
  6. React Native 生成 released apk图片不显示
  7. matlab滑稽表情代码,【图片】各种滑稽代码【s极圈吧】_百度贴吧
  8. Windows下 VMware XP虚拟机 架设论坛
  9. 计算机锁屏图片怎么设置方法,怎么设置电脑锁屏图片 电脑锁屏图片设置步骤...
  10. excel文件打不开怎么办_移动硬盘打不开提示格式化怎么办?
  11. 什么是数据可视化技术
  12. pyqt5中sender方法介绍_PyQt5学习记录(二):Event sender
  13. Python 视频转换为图片 与 图片转换为视频
  14. [附源码]计算机毕业设计JAVA企业员工管理系统
  15. Linux中的管道和过滤器
  16. 【Cat.1模组】 广和通L610 基于OpenCPU的SDK二次开发
  17. 什么是红帽认证?学红帽有用吗?含金量到底有多高?
  18. 【C++】动态规划之状态转移方程(单串)
  19. 微信公众 php代码,微信公众号开发之文本消息自动回复php代码_php实例
  20. 桌面录屏录音技术,录屏软件原理

热门文章

  1. 姚班代有才人出:清华本科生用“最简单的形式”,大幅提高少样本学习性能...
  2. 如何及时获得AI顶尖科研团队的最新论文与进展?只需一份AI内参!
  3. GraphQL 01--- GraphQL 介绍及资源总结
  4. 5、Makefile基础知识汇总(转自陈皓总述)
  5. javascript:12种JavaScript MVC框架之比较
  6. C#部署安装,将用户安装路径记录下写入注册表,并启动
  7. 转发与重定向(forward与redirect)
  8. 中移动TD终端资助或只限五洋巨头
  9. 多元有序logistic回归_医学统计与R语言:多分类logistic回归HosmerLemeshow拟合优度检验...
  10. C 语言编程 — 输入/输出与文件操作