C++ Reference

引用实际上是指针的一个扩展,但是又不同于指针。
首先,引用必须引用一个已经存在的变量。不像指针,指针可以被声明为空指针,但引用不可以。引用本身并不是一个新的变量,它并不实际占用内存空间,也并不实际储存数据,它仅仅是一个变量的引用。

举例说明:

#include <iostream>#define LOG(x) std::cout << x << std::endl;int main()
{int a = 5;int& ref = a;std::cin.get();
}

在上述代码中,ref 是变量 a 的引用。实际上,ref 相当于变量 a 的别名。 如果将上述代码编译,实际上只会在内存空间中创建一个变量 a。

如果改变 ref 的值,打印 a:

#include <iostream>#define LOG(x) std::cout << x << std::endl;int main()
{int a = 5;int& ref = a;ref = 2;LOG(a);std::cin.get();
}

则 a 的值也为 2.

即变量的引用仅仅相当于该变量的别名,并不会重新生成一个变量。

那么既然仅仅只是给变量起一个别名,什么情况下我们需要用到引用呢?就上述情况而言,我们直接调用变量 a 就可以了,为啥要多写几行代码来创建一个引用呢?

看下面的例子:

#include <iostream>#define LOG(x) std::cout << x << std::endl;void Increment(int value)
{value++;
}int main()
{int a = 5;Increment(a);LOG(a);std::cin.get();
}

如果我们想要变量 a 调用 Increment,然后自加 1. 上述代码是无法实现这个结果的 ,实际输出 a 的值仍然为 5。这是因为 将变量 a 传给方法 Increment, 相当于复制该变量到方法里。

等同于如下效果:

void Increment(int value)
{int a = 5;value++;
}

所以并不会改变变量 a 的值。

那想要达到我们想要的结果,如何做呢?

首先,当然,指针是可以做到的。指针指向的是变量的内存空间中的地址,即变量实际存在的地方。如果我们直接把变量的地址传给 Increment 函数,那肯定是可以改变该变量的值的,如下所示:

#include <iostream>#define LOG(x) std::cout << x << std::endl;void Increment(int* value)
{(*value)++;
}int main()
{int a = 5;Increment(&a);LOG(a);std::cin.get();
}

输出结果为 6.

可以看到,指针确实能得到我们想要的结果。但有没有更简单清晰一点的方法呢?

#include <iostream>#define LOG(x) std::cout << x << std::endl;void Increment(int& value)
{value++;
}int main()
{int a = 5;Increment(a);LOG(a);std::cin.get();
}

运行结果为 6. 可见引用也可以实现我们的目的,并且让代码看起来更加简洁。

再看一个例子:

#include <iostream>#define LOG(x) std::cout << x << std::endl;int main()
{int a = 5;int b = 8; int& ref = a;ref = b;LOG(a);LOG(b);std::cin.get();
}

输出结果为 8, 8。 即变量 a 等于 b = 8。 为什么会这样? 因为引用只能被初始化一次,指向一个变量,并且不能够改变。同时,引用在被声明的同时一定要被初始化。当然,指针是可以先指向一个变量,然后指向另一个变量的。

C++ 引用 (Reference)相关推荐

  1. java reference 传引用_Java的引用(reference)---Roni

    摘自<Java面向对象编程>一书,作者:孙卫琴 来源:www.javathinker.org 在JDK1.2以前的版本中,当一个对象不被任何变量引用,那么程序就无法再使用这个对象.也就是说 ...

  2. Java中各种引用(Reference)解析

    目录 1,引用类型 2, FinalReference 2.1, Finalizer 3, SoftReference 4, WeakReference 5, PhantomReference 6, ...

  3. java byreference_Java中各种引用(Reference)解析

    1,引用类型 java.lang.ref整体包结构 类型 对应类 特征 强引用 强引用的对象绝对不会被gc回收 软引用 SoftReference 如果物理内存充足则不会被gc回收,如果物理内存不充足 ...

  4. Java篇 - 四种引用(Reference)实战

    Java的垃圾回收(GC)是虚拟机自动管理的,前面我有篇文章专门讲GC:<JVM篇 - GC给你整明白> Java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看 ...

  5. 引用(Reference)

    先复习一下C语言中,指针的用法 a所在的地址即pa指针变量储存的值,和a改变后的值30 #include <iostream> using namespace std; int main( ...

  6. java byreference_深入理解Java中的引用(一)——Reference

    深入理解Java中的引用(一)--Reference 本系列文章首先会介绍Reference类,为之后介绍的强引用.软引用.弱引用和虚引用打下基础. 最后会介绍虚引用在DirectBuffer回收中的 ...

  7. C++ 语言左值引用 (lvalue reference)

    C++ 语言左值引用 (lvalue reference) C++11 中新增了右值引用 (rvalue reference).当我们使用术语引用 (reference) 时,指的其实是左值引用 (l ...

  8. C++/C++11中左值、左值引用、右值、右值引用的使用

    C++的表达式要不然是右值(rvalue),要不然就是左值(lvalue).这两个名词是从C语言继承过来的,原本是为了帮助记忆:左值可以位于赋值语句的左侧,右值则不能. 在C++语言中,二者的区别就没 ...

  9. C++/C++11中引用的使用

    引用(reference)是一种复合类型(compound type).引用为对象起了另外一个名字,引用类型引用(refer to)另外一种类型.通过将声明符写成&d的形式来定义引用类型,其中 ...

  10. C++中Reference与指针(Pointer)的使用对比

    了解引用reference与指针pointer到底有什么不同可以帮助你决定什么时候该用reference,什么时候该用pointer. 在C++ 中,reference在很多方面与指针(pointer ...

最新文章

  1. java-类(class)继承,重写,重构,抽象,接口等
  2. NWBC连接配置及使用
  3. hadoop2.6.5安装文档及解决root用户无法ssh localhost的问题
  4. 计算机软件技术大作业报告,多媒体技术大作业报告.doc
  5. 产品经理学SQL(二)
  6. java每过一段时间执行一次代码(方法)
  7. Python中的正则表达式(re)
  8. MWeb Pro for Mac(静态博客生成软件)
  9. paip.提高用户体验----增添开始菜单类似360小助手按钮总结 (补充c925)
  10. 关于mac的open命令
  11. 大学计算机计算思维期末试题及答案,大学计算机计算思维导论期末考试
  12. Python的学习笔记案例4--52周存钱挑战3.0
  13. CentOS 添加微软雅黑字体
  14. 个人百科怎么做,如何申请个人百度百科
  15. AV1编码器优化技术
  16. 关于微信开放平台授权事件接收Url的配置以及参数接收
  17. 公务员面试题——人际关系
  18. 2020计算机考研扩招,官|东北石油大学计算机学院2020研究生调剂·增额扩招
  19. vim插件管理器:Vundle的介绍及安装(很全)(转载)
  20. 读《孙子兵法》,品启强人生

热门文章

  1. BigDecimal 保留小数位
  2. java文件中搜索的快捷键_MyEclipse中的查找快捷键
  3. Java面向对象综合训练综合练习
  4. mysql的dual_mysql中dual是什么意思
  5. STM32F0的BOOT
  6. 沃尔玛erp系统功能分析
  7. Linux常用命令总结(一)
  8. android 设备最大像素,最高2100万像素镜头 拍照强悍手机盘点
  9. AJAX之封装+跨域
  10. iptables ip 白名单操作