引用是C语言中没有,而在C++中又很重要的一个概念,通过应用,可以得到变量本身,相对于得到变量的值而言,有更大的操作空间。

普通引用

变量的本质

变量名实质上是一段连续存储空间的别名,是一个标号

程序中通过变量来申请并命名内存空间

通过变量的名字可以使用存储空间

引用是C++的概念,属于C++编译器对C的扩展

  1. int main()
  2. {
  3. int a = 0;
  4. int &b = a;
  5. b = 10;
  6. return 0;
  7. }

引用的概念

  • 在C++中新增加了引用的概念
  • 引用可以看作一个已定义变量的别名
  • 引用的语法:Type& name = var;
  • 引用作为函数参数声明时不进行初始化
  1. int main()
  2. {
  3. int a = 10;
  4. int &b = a;
  5. b = 10;
  6. cout<<"b--->"<<a<<endl;
  7. printf("a:%d\n", a);
  8. printf("b:%d\n", b);
  9. printf("&a:%d\n", &a);
  10. printf("&b:%d\n", &b);
  11. system("pause");
  12. return 0;
  13. }

引用的理解

  1. 普通引用在声明时必须用其它的变量进行初始化
  2. 引用作为其它变量的别名而存在,因此在一些场合可以代替指针,引用相对于指针来说具有更好的可读性和实用性
  1. int swap(int &a, int &b)
  2. {
  3. int t = a;
  4. a = b;
  5. b = t;
  6. return 0;
  7. }
  1. int swap(int *a, int *b)
  2. {
  3. int t = *a;
  4. *a = *b;
  5. *b = t;
  6. return 0;
  7. }
  1. 普通引用拥有自己的内存空间,有地址,是一个常量,相当于一个常指针,char *const p
  1. struct Teacer {
  2. int &a;
  3. int &b;
  4. };
  5. int main()
  6. {
  7. printf("sizeof(Teacher) %d\n", sizeof(Teacer));
  8. system("pause");
  9. return 0;
  10. }
  1. 引用的本质
  • 引用在C++中的内部实现是一个常指针
  1. Type& name <=> Type* const name
  • C++编译器在编译过程中使用常指针作为引用的内部实现,因此引用所占用的空间大小与指针相同
  • 从使用的角度,引用会让人误会其只是一个别名,没有自己的存储空间。这是C++为了实用性而做出的细节隐藏
  1. void func(int &a)
  2. {
  3. a = 10;
  4. }
  5. void func(int *const a)
  6. {
  7. *a = 10;
  8. }
  1. 当函数返回值为引用时,若返回栈变量,不能成为其它引用的初始值,不能作为左值使用。若返回静态变量或全局变量,可以成为其他引用的初始值,即可作为右值使用,也可作为左值使用。C++链式编程中,经常用到引用
  2. 当实参传给形参引用的时候,只不过是c++编译器帮我们程序员手工取了一个实参地址,传给了形参引用(常量指针)

常引用

const引用(使用变量初始化const引用)

在C++中可以声明const引用

  1. const Type& name = var

const引用让变量拥有只读属性

  1. int a = 10;
  2. const int &b = a;

此时便不可以使用b来修改a的值了,只能使用a自身和指针。

const引用(使用字面量常量初始化const引用)

  1. int main()
  2. {
  3. const int &a = 10; //去掉const则编译报错
  4. int *p = (int *)&a; //注意需要(int *)
  5. *p = 12;
  6. printf("a:%d", a);
  7. system("pause");
  8. return 0;
  9. }

当使用常量(字面量)对const引用进行初始化时,C++编译器会为常量值分配空间,并将引用名作为这段空间的别名

使用常量对const引用初始化后将生成一个只读变量

const引用总结

Const&相当于const int * const e

普通引用相当于int *const e

例子

  1. int& func1()
  2. {
  3. static int a = 0;
  4. return a;
  5. }
  6. int& func2()
  7. {
  8. int a = 0;
  9. return a;
  10. }
  11. int main()
  12. {
  13. int a = func2();
  14. int& b = func2();
  15. func1() = 10;
  16. printf("a = %d\n", a);
  17. printf("b = %d\n", b);
  18. printf("f() = %d\n", f());
  19. system("pause");
  20. return 0;
  21. }

C++学习笔记-引用的更多相关文章

  1. jvm内存JVM学习笔记-引用(Reference)机制

    在写这篇文章之前,xxx已经写过了几篇关于改jvm内存主题的文章,想要了解的朋友可以去翻一下之前的文章 如果你还不了解JVM的基本概念和内存划分,请阅读JVM学习笔记-基础知识和JVM学习笔记-内存处 ...

  2. cocos2dx 3.0 学习笔记 引用cocostudio库 的环境配置

    cocostudio创建UI并应用时须要引用cocostudio库,须要额外的环境配置: 之前已经搭配好了基础的开发环境,包含 1) JDK 2) Python 2.7 3) ant 4) visua ...

  3. C++学习笔记---引用的本质

    本质:引用本质上是C++内部实现的一个指针常量 发现是引用的话,自动帮我们转换成指针常量 运行后,发现修改ref的值那么a的值也会一起改变,这就说明了引用的本质就是指针

  4. swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  5. 0030 Java学习笔记-面向对象-垃圾回收、(强、软、弱、虚)引用

    垃圾回收特点 垃圾:程序运行过程中,会为对象.数组等分配内存,运行过程中或结束后,这些对象可能就没用了,没有变量再指向它们,这时候,它们就成了垃圾,等着垃圾回收程序的回收再利用 Java的垃圾回收机制 ...

  6. [原创]java WEB学习笔记98:Spring学习---Spring Bean配置及相关细节:如何在配置bean,Spring容器(BeanFactory,ApplicationContext),如何获取bean,属性赋值(属性注入,构造器注入),配置bean细节(字面值,包含特殊字符,引用bean,null值,集合属性list map propert),util 和p 命名空间

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  7. Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)

    Java四种引用--<深入理解Java虚拟机>学习笔记及个人理解(四) 书上P65. StrongReference(强引用) 类似Object obj = new Object() 这类 ...

  8. Dubbo -- 系统学习 笔记 -- 示例 -- 泛化引用

    Dubbo -- 系统学习 笔记 -- 目录 示例 想完整的运行起来,请参见:快速启动,这里只列出各种场景的配置方式 泛化引用 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值 ...

  9. C#学习笔记(基础知识回顾)之值类型与引用类型转换(装箱和拆箱)

    一:值类型和引用类型的含义参考前一篇文章 C#学习笔记(基础知识回顾)之值类型和引用类型 1.1,C#数据类型分为在栈上分配内存的值类型和在托管堆上分配内存的引用类型.如果int只不过是栈上的一个4字 ...

随机推荐

  1. C/C++字符串转换函数;

    字符串转数字: char 转 int 函数: atoi   wchar  转 int 函数: _wtoi 数字转字符串: std::to_string(): std::to_wsting();

  2. JavaScript算术运算符

    ㈠运算符(操作符) ⑴通过运算符可以对一个或多个值进行运算,并获取运算结果 ⑵比如:typeof就是运算符,可以来获得一个值得类型               它会将该值的类型以字符串的形式返回   ...

  3. 《剑指offer》算法题第十天

    今日题目: 数组中的逆序对 两个链表的第一个公共节点 数字在排序数组中出现的次数 二叉搜索树的第k大节点 字符流中第一个不重复的字符 1. 数组中的逆序对 题目描述: 在数组中的两个数字,如果前面一个 ...

  4. html5文件夹上传下载组件

    我们平时经常做的是上传文件,上传文件夹与上传文件类似,但也有一些不同之处,这次做了上传文件夹就记录下以备后用. 这次项目的需求: 支持大文件的上传和续传,要求续传支持所有浏览器,包括ie6,ie7,i ...

  5. BFS解决九宫重排问题

    问题 1426: [蓝桥杯][历届试题]九宫重排 时间限制: 1Sec 内存限制: 128MB 提交: 215 解决: 47 题目描述 如下面第一个图的九宫格中,放着  1~8  的数字卡片,还有一个 ...

  6. Android UI编程之自定义控件初步——ImageButton

    我想我们在使用一些App的时候,应该不会出现一些“裸控件”的吧.除非是一些系统中的软件,那是为了保持风格的一致性,做出的一些权衡.我这里并非是在指责Android原生的控件不好看,说实在的,我很喜欢A ...

  7. Work Queues(工作队列)

    1.模型 2.创建生产者 package com.dwz.rabbitmq.work; import java.io.IOException; import java.util.concurrent. ...

  8. 【知识库】-数据库_MySQL性能分析之Query Optimizer

    简书作者:Sio 文章出处: MySql优化之索引原理与 SQL 优化 Query Optimizer MySQL Optimizer是一个专门负责优化SELECT 语句的优化器模块,它主要的功能就是 ...

  9. 使用Jmeter对观影券查询接口做性能测试

    线程数:虚拟用户数.一个虚拟用户占用一个进程或线程.设置多少虚拟用户数在这里也就是设置多少个线程数. 准备时长: 设置的虚拟用户数需要多长时间全部启动.如果线程数为20 ,准备时长为10 ,那么需要1 ...

  10. 已知源目录路径sourceFilePath,此目录下还有多级子目录和多个文本文件(*.txt)。尝试编写一个方法,将此目录下所有的文件拷贝至另一个目录targetFilePath,并其中的文本文件修改成SQL文件(*.SQL)。

    public void copyFile(String oldPath, String newPath) throws IOException { (new File(newPath)).mkdirs ...