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,指针自加即指针向后偏移一个类型的大
  • 有多级指针,但是没有多级引用
  • 访问实体方式不同,指针需要显式解引用,引用编译器自己处理
  • 引用比指针使用起来相对更安全
相关文章
|
2月前
|
存储 程序员 编译器
玩转C++内存管理:从新手到高手的必备指南
C++中的内存管理是编写高效、可靠程序的关键所在。C++不仅继承了C语言的内存管理方式,还增加了面向对象的内存分配机制,使得内存管理既有灵活性,也更加复杂。学习内存管理不仅有助于提升程序效率,还有助于理解计算机的工作原理和资源分配策略。
|
5月前
|
Java 数据库连接 测试技术
SpringBoot入门 - 添加内存数据库H2
SpringBoot入门 - 添加内存数据库H2
243 3
SpringBoot入门 - 添加内存数据库H2
|
30天前
|
存储 Linux C语言
C++/C的内存管理
本文主要讲解C++/C中的程序区域划分与内存管理方式。首先介绍程序区域,包括栈(存储局部变量等,向下增长)、堆(动态内存分配,向上分配)、数据段(存储静态和全局变量)及代码段(存放可执行代码)。接着探讨C++内存管理,new/delete操作符相比C语言的malloc/free更强大,支持对象构造与析构。还深入解析了new/delete的实现原理、定位new表达式以及二者与malloc/free的区别。最后附上一句鸡汤激励大家行动缓解焦虑。
|
30天前
|
存储 分布式计算 编译器
C++入门基础2
本内容主要讲解C++中的引用、inline函数和nullptr。引用是变量的别名,与原变量共享内存,定义时需初始化且不可更改指向对象,适用于传参和返回值以提高效率;const引用可增强代码灵活性。Inline函数通过展开提高效率,但是否展开由编译器决定,不建议分离声明与定义。Nullptr用于指针赋空,取代C语言中的NULL。最后鼓励持续学习,精进技能,提升竞争力。
|
2月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
4月前
|
存储 缓存 编译器
【硬核】C++11并发:内存模型和原子类型
本文从C++11并发编程中的关键概念——内存模型与原子类型入手,结合详尽的代码示例,抽丝剥茧地介绍了如何实现无锁化并发的性能优化。
237 68
|
2月前
|
安全 C语言 C++
彻底摘明白 C++ 的动态内存分配原理
大家好,我是V哥。C++的动态内存分配允许程序在运行时请求和释放内存,主要通过`new`/`delete`(用于对象)及`malloc`/`calloc`/`realloc`/`free`(继承自C语言)实现。`new`分配并初始化对象内存,`delete`释放并调用析构函数;而`malloc`等函数仅处理裸内存,不涉及构造与析构。掌握这些可有效管理内存,避免泄漏和悬空指针问题。智能指针如`std::unique_ptr`和`std::shared_ptr`能自动管理内存,确保异常安全。关注威哥爱编程,了解更多全栈开发技巧。 先赞再看后评论,腰缠万贯财进门。
149 0
|
3月前
|
存储 程序员 编译器
什么是内存泄漏?C++中如何检测和解决?
大家好,我是V哥。内存泄露是编程中的常见问题,可能导致程序崩溃。特别是在金三银四跳槽季,面试官常问此问题。本文将探讨内存泄露的定义、危害、检测方法及解决策略,帮助你掌握这一关键知识点。通过学习如何正确管理内存、使用智能指针和RAII原则,避免内存泄露,提升代码健壮性。同时,了解常见的内存泄露场景,如忘记释放内存、异常处理不当等,确保在面试中不被秒杀。最后,预祝大家新的一年工作顺利,涨薪多多!关注威哥爱编程,一起成为更好的程序员。
111 0
|
5月前
|
存储 缓存 C语言
【c++】动态内存管理
本文介绍了C++中动态内存管理的新方式——`new`和`delete`操作符,详细探讨了它们的使用方法及与C语言中`malloc`/`free`的区别。文章首先回顾了C语言中的动态内存管理,接着通过代码实例展示了`new`和`delete`的基本用法,包括对内置类型和自定义类型的动态内存分配与释放。此外,文章还深入解析了`operator new`和`operator delete`的底层实现,以及定位new表达式的应用,最后总结了`malloc`/`free`与`new`/`delete`的主要差异。
116 3

热门文章

最新文章