C++入门》》内存单元的别名---引用

简介:

@[TOC]

前言:

  • 本文介绍C++的特殊语法--》》变量的别名--引用。
  • 博主收集的资料New Young,连载中。
  • 博主收录的问题:New Young
  • 转载请标明出处:New Young

补充

临时变量

其实很多的运算比如:表达式,返回值,隐式类型转换等都会生成具有==常属性==的临时变量tmp

image-20220309120235937

虽然有的简单的函数的函数栈帧在销毁会将值存在到寄存器eax中,但是寄存器非常小(4字节,8字节等),当存放的类型占用内存很大时,就不会存放到寄存器中,而是在当前调用函数那层栈帧中开辟一个==临时的变量==,用于存放返回值。

image-20220308213913200

引用的概念

  • 无论是程序还是计算机,最终操作的都是==内存单元==,而存储数据元素的变量实际上是内存单元别名。而对于同一个内存单元,我们可以给它取==很多别名==,而这些别名就是那个内存单元。可以看出引用是不需要开辟空间的,没有必要。
  • 同样如果对一个变量名取==别名==---引用,那些==别名==就是变量,也就是内存单元的别名,那么对这些别名进行的运算结果是==直接影响==内存单元,也同样==影响==其它别名
  • image-20220308204609297

引用的形式

起别名对象的类型+关键字&+别名=引用对象

image-20220308210153743

引用的注意点

  • 引用是不会开辟空间的,不占内存
  • 引用在定义时==必须==初始化
  • 同一变量的引用,只要其中一个对==内存单元==操作了,其影响就会映射到原变量---所有别名就是变量本身,在别名上的操作就是对变量的操作。
  • 一个变量可以有多个引用
  • 引用一旦引用的实体,就不能成为其它实体的引用。

常引用

权限

  • 权限指的是对==内存单元==的读或写操作。
  • 权限放大:小权限的操作是进行大权限的操作,称为权限放大,这是不允许的。
  • 权限缩小:大权限的操作进行小权限的操作是允许的

image-20220308221457908

引用的使用场景

做函数的形参

void swap(int& a, int& b)
{
    int tmp = a;
    a = b;
    b = a;
}

做函数返回值

  • 可以做函数返回值,但是要小心使用

比如

image-20220308224956607

  • 如果函数返回时,出了函数作用域,如果返回对象还未还给系统(静态变量,全局变量等),则可以使用引用返回,如果已经还给系统了,则必须使用传值返回 .。

引用的优点

  • 引用是不开辟空间的,这就在某些地方,可以提高程序运行效率。
  • 而传值,会在函数栈帧期间为形参开辟空间,是有时间消耗的

image-20220308230216877

引用与指针的区别

  • 指针是一个变量,只是它的内存单元存放的是地址,通过这个地址我们可以操作它对应的内存单元,本质上和引用是不一样的。虽然有时候,
  • 引用《高质量C++程序设计》:用适当的工具做恰如其分的工作。引用体现的是最小特权原则,即给予程序元素以完成功能的最小权限。而指针能够毫无约束的操作内存是非常危险的。

以下的总结理解就行,不需要特别记忆。

  • 引用在初始化时引用一个实体后,就不能再引用其他实体,而指针可以在任何时候指向任何一个同类型
    实体
  • 没有NULL引用,但有NULL指针
  • sizeof中含义不同:引用结果为引用类型的大小,但指针始终是地址空间所占字节个数(32位平台下占4个字节)
  • 引用自加即引用的实体增加1,指针自加即指针向后偏移一个类型的大
  • 有多级指针,但是没有多级引用
  • 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  • 引用比指针使用起来相对更安全
相关文章
|
28天前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
39 3
SpringBoot入门 - 添加内存数据库H2
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
52 4
SpringBoot入门(4) - 添加内存数据库H2
|
2月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
36 2
SpringBoot入门(4) - 添加内存数据库H2
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
67 13
|
1月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
88 4
|
1月前
|
Java 数据库连接 测试技术
SpringBoot入门(4) - 添加内存数据库H2
SpringBoot入门(4) - 添加内存数据库H2
47 4
|
2月前
|
存储 安全 编译器
【C++打怪之路Lv1】-- 入门二级
【C++打怪之路Lv1】-- 入门二级
28 0
|
2月前
|
自然语言处理 编译器 C语言
【C++打怪之路Lv1】-- C++开篇(入门)
【C++打怪之路Lv1】-- C++开篇(入门)
37 0
|
2月前
|
分布式计算 Java 编译器
【C++入门(下)】—— 我与C++的不解之缘(二)
【C++入门(下)】—— 我与C++的不解之缘(二)
|
28天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
232 1