指针 || 引用 || const || 智能指针 || 动态内存

复合类型:

引用:

  1. 基本概念: 绑定对象,不发生拷贝(当普通赋值时,为确保创建新的对象,分配新的地址,对象拷贝操作),相当于对象的别名
  2. 初始化:type & name = obj;
    1. 只能绑定在对象(左值)上,之后所有操作都在绑定的对象进行
    2. 因为一旦绑定了对象,就不能更改,因此定义时必须初始化
    3. 引用非对象:没有 地址 / 内存(数据),因此不能定义引用的引用,也没有const 引用
    4. 初始化时对象类型必须要与引用的类型一致:
      1. 因为类型不一致时,编译器为确保引用绑定相同类型,创建了临时量,我们想要对绑定的对象操作,但目前绑定的只是临时量,不会影响对象本身,所以无法做到我们期望的结果,因此这种行为定义为非法
  3. 赋值:name = val;对引用绑定的对象赋值

指针:

  1. 基本概念:指向对象的地址
  2. 初始化: type * name = &obj取地址;
    1. 定义(分配内存)时不需要初始化(填充数据)
    2. 指针是对象:有自己的内存空间,因此可以定义指针的指针 / 指向指针的引用:type *& name = obj;
    3. 初始化时对象类型必须要与指针的类型一致
  3. 赋值:
  4. 可以改变指针指向的对象(p = &obj || **p = &p2(指向指针的指针) || p = p2(指向同一对象,p2指针作为右值取p2的值)),也可以改变所指向对象的值( *p解引用 = Val)
  5. 特殊指针:

  6. 空指针:没有指向任何对象,=nullptr / = 0 / =null(0)(尽量避免使用),试图访问指针指向对象的值,行为不被允许
  7. 无效指针:指向无效内存,试图访问指针指向对象的值,引发错误
  8. void*指针:可以指向任何类型对象, 限制:无法操作所指对象,

技巧:

  1. 如何判断对象类型?从右往左读,右侧优先级更高
  2. 如何判断我们改变了,指针指向的对象 还是 对改变所指向对象的值?赋值永远改变左侧的对象
  3. 同符号有多重含义,如何区分?在定义声明时组成复合类型,在表达式则为取地址/解引用

const常量对象:(非常量->常量 , 常量 !->非常量)

  1. 基本概念:限制变量的值无法改变(防止意外修改)
  2. 初始化:
    1. 定义时必须初始化:const type name = ……
    2. 允许非常量初始化常量
  3. 不允许对常量赋值
  4. 作用域:文件
  5. 对const的引用

    1. 与普通引用的区别:
    2. 初始化时,类型不一定要一致,只要可以转换为引用的类型就可以(非const, 字面值,表达式)
    3. 不允许通过引用,改变绑定的对象的值,但并不意味着不能通过其他途经修改(直接给对象赋值(更改数据)/ 绑定到普通引用)
  6. 对const的指针:

    1. 与普通指针的区别:
    2. 初始化时,指向的对象类型可以为非const
    3. 不允许通过指针*p=,改变指向的对象的值
  7. const 指针:

    1. 与普通指针的区别:
    2. 定义时必须初始化
    3. 并不能改变指针指向的对象,但允许改变所指对象的值
  8. 指向const的const指针:

    1. ·不允许改变指向的对象的值,也不能改变指针指向的对象,
  9. 顶层 / 底层:
    1. 顶层const:本身是常量
    2. 底层const:所指向的对象是常量
    3. 可以即是顶层又是底层
  10. 内存:静态(存放生命周期为整个程序的),堆(保存动态分配的对象),栈(自动的生命周期)

内置指针:

  1. new运算符(手动管理动态内存):

    1. 在堆中分配内存,返回指向该动态分配对象的指针:int * p = new int;‘
    2. 初始化对象:对象默认情况为默认初始化,可以用()直接初始化对象的数据
    3. 内存耗尽:用光了堆内存
    4. 释放内存:防止内存耗尽,delete:销毁指向的对象,释放对应的内存。对象的生命周期在被delete前一直存在
    5. 未定义行为:delete必须释放动态分配的内存,并且相同的指针值不能释放多次,否则行为将未定义
    6. 空悬指针:当delete指针,虽热内存释放了,但指针仍保存着无效内存的地址,成为了未初始化的指针(无效指针)
    7. 如何避免空悬指针?重置指针:如果要保留指针,让指针指向nullptr,变为空指针
    8. 但是:当多个指针指向同一内存,重置仅针对这个指针有效

智能指针(自动管理动态内存):

  1. shared_ptr<type> name:(允许多个指针指向同一对象)

    1. 初始化:默认初始化为空指针
    2. 最安全的分配动态内存:= make_shared<name>(val);返回指向,动态分配并初始化未val的对象 ,的shared_ptr.
    3. 引用计数:
      1. 当初始化另一个shared_ptr / 按值传递 / 作为返回值……计数器++;
      2. 当被赋值 / 销毁(例如局部定义的)……计数器 --;
      3. 当计数器 == 0,自动销毁(delete)指向的对象,释放对应的内存。
    4. 作用:适用于多所有者共享对象的场景
  2. shared_ptr&& 普通指针

    1. shared_ptr<type> p(new type(val));:new动态分配返回的指针指向的对象,初始化shared_ptr(必须采用这种直接初始化形式,不能用=拷贝初始化,因为shared_ptr的构造是explicit的,同样作为return也必须显示初始化)
    2. 注意事项:当混合使用new返回的普通指针 *p 和 shared_ptr p 的智能指针,容易引发错误(空悬指针 / 未定义行为):
    3. 当shared_ptr接管了内置指针,可能会无意释放掉内置指针指向的动态分配的内存
    4. 不要用get()初始化智能指针 / 为智能指针赋值:
    5. get()(返回内置指针:指向智能指针管理的对象):当不能使用智能指针时传递内置指针
  3. shared_ptr的其他操作:

    1. shared_ptr<type> p(p1)p是shared_ptr  p1的拷贝,指向同一个对象
    2. shared_ptr<type> p(p1)p管理内置指针  p1所指向的对象,p1必须指向new动态分配的内存
    3. shared_ptr<type> p(u)p接管unique_ptr u的对象
    4. reset重置(q可选参数)(相当于内置指针赋值):指向新的对象(内置指针q指向的对象),注意同样会更新引用计数(释放p指向的对象)。当q不存在,会释放(delete)shared_ptr的对象
  4. unique_ptr<type>name;(和普通指针&&shared_ptr都不同(多对一),只能一个unique_ptr独占一个对象(一对一)):

    1. 初始化时必须直接初始化:unique_ptr<type> p(new type(val));
    2. 不支持拷贝/赋值操作,除了可以对将要被销毁的unique_ptr拷贝/赋值操作
    3. 支持转移所有权(从一个unique_ptr到另一个unique_ptr):
      1. release()将指针置为空,并返回内置指针(如果不用来初始化/赋值 智能指针,要记得delete)
      2. reset(q)指向新的对象(指向内置指针q指向的对象)
    4. 当unique_ptr被离开作用域时,指向的对象也被销毁
    5. 作用:适用于独占所有权的场景
  5. weak_ptr:弱的

    1. 初始化:通过shared_ptr初始化(make_shared)
    2. 弱引用:不会增加引用计数
    3. 检查目标是否存在:lock()如果存在返回shared_ptr
    4. 作用:避免shared_ptr可能引发的循环引用问题

为什么使用动态内存?

  1. 不知道需要使用多少对象
  2. 不知道对象需要的准确类型
  3. 在多个对象间共享同一数据(当对象销毁数据不会销毁):shared_ptr:例如对shared_ptr拷贝时,两个指针都指向同一对象
  4. 手动控制对象的生命周期:new

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/782322.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++面向对象的常见面试题目(一)

1. 面向对象的三大特征 &#xff08;1&#xff09;封装&#xff1a;隐藏对象的内部状态&#xff0c;只暴露必要的接口。 #include <iostream> #include <string>// 定义一个简单的类 Person class Person { private: // 私有成员&#xff0c;外部不可直接访问std…

通俗易懂的信道复用技术详解:频分、时分、波分与码分复用

在现代通信网络中&#xff0c;信道复用技术 扮演着至关重要的角色。今天&#xff0c;我们将用通俗易懂的语言来讲解几种常见的信道复用技术&#xff1a;频分复用、时分复用、波分复用 和 码分复用。这篇文章特别适合基础小白&#xff0c;希望能帮助你快速理解这些概念。 一、频…

Bean的管理

1.主动获取Bean spring项目在需要时&#xff0c;会自动从IOC容器中获取需要的Bean 我们也可以自己主动的得到Bean对象 &#xff08;1&#xff09;获取bean对象&#xff0c;首先获取SpringIOC对象 private ApplicationContext applicationContext //IOC容器对象 (2 )方法…

[算法] 优先算法(四):滑动窗口(下)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Springboot 敏感词过滤

参考&#xff1a;网站是怎么屏蔽脏话的呢&#xff1a;简单学会SpringBoot项目敏感词、违规词过滤方案_springboot 项目关键词过滤-CSDN博客 【敏感词过滤】_wx60d2a462203aa的技术博客_51CTO博客 1、添加依赖 <dependency><groupId>com.github.houbb</groupI…

模型训练之数据集

我们知道人工智能的四大要素&#xff1a;数据、算法、算力、场景。我们训练模型离不开数据 目标 一、数据集划分 定义 数据集&#xff1a;训练集是一组训练数据。 样本&#xff1a;一组数据中一个数据 特征&#xff1a;反映样本在某方面的表现、属性或性质事项 训练集&#…

输入Rviz打不开,显示could not contact Ros master at[..],retrying

直接输入rviz会报错无法打开 解决方法&#xff1a; 先输入roscore&#xff0c;再用ctrlaltt打开新终端&#xff0c;在新终端输入rviz/rosrun rviz rviz即可

深度学习3 基于规则的决策树模型

1.决策树是一种归纳学习算法&#xff0c;从一些没有规则、没有顺序、杂乱无章的数据中&#xff0c;推理出决 策模型。不管是什么算法的决策树&#xff0c;都是一种对实例进行分类的树形结构。决策树有三个要素&#xff1a;节点(Node)、分支(Branches)和结果(Leaf)。 训练决策树…

二、Spring

二、Spring 1、Spring简介 1.1、Spring概述 官网地址&#xff1a;https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架&#xff0c;数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

VMware Workstation Pro 17.5.2 + license key

Workstation Pro是专为Windows操作系统设计的功能强大的虚拟化软件平台,它允许用户在其计算机上创建和运行虚拟机,这使他们能够同时与多个操作系统、应用程序和开发环境一起工作。 Workstation Pro的主要特点之一是其易用性,程序提供了直观的界面,允许用户轻松创建、配置和…

JCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断

JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断 目录 JJCR一区 | Matlab实现GAF-PCNN-MATT、GASF-CNN、GADF-CNN的多特征输入数据分类预测/故障诊断分类效果格拉姆矩阵图GAF-PCNN-MATTGASF-CNNGADF-CNN 基本介绍程序设计参考资料 分…

Ubuntu24.04清理常见跟踪软件tracker

尽量一天一更&#xff0c;不刷视频&#xff0c;好好生活 打开系统监视器&#xff0c;发现开机有个tracker-miner-fs-fs3的跟踪程序&#xff0c;而且上传了10kb的数据。 搜索知&#xff0c;该程序会搜集应用和文件的信息。 删除tracker 显示带tracker的apt程序 sudo apt lis…

【Excel】 给证件照换底色

1. 双击图片 → 删除背景 2. 标记要保留的区域 → 标记 → 保留更改 3. 重新设置背景色

最新整理的机器人相关数据合集(1993-2022年不等 具体看数据类型)

机器人安装数据是指记录全球或特定区域内工业机器人新安装数量的信息&#xff0c;这一数据由国际机器人联合会(IFR)等权威机构定期发布。这些数据不仅揭示了机器人技术的市场需求趋势&#xff0c;还反映了各国和地区自动化水平及产业升级的步伐。例如&#xff0c;数据显示中国在…

基于Java+SpringMvc+Vue技术的图书管理系统的设计与实现(60页论文参考)

博主介绍&#xff1a;硕士研究生&#xff0c;专注于Java技术领域开发与管理&#xff0c;以及毕业项目实战✌ 从事基于java BS架构、CS架构、c/c 编程工作近16年&#xff0c;拥有近12年的管理工作经验&#xff0c;拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经…

回顾 DTC 2024 大会——聚焦数据技术创新:揭秘下一代纯实时搜索引擎 INFINI Pizza

2024 年 4 月 12 日至 13 日&#xff0c;备受瞩目的第十三届“数据技术嘉年华”&#xff08;DTC2024&#xff09;在北京新云南皇冠假日酒店盛大开幕。本次大会由中国 DBA 联盟&#xff08;ACDU&#xff09;与墨天轮社区联合主办&#xff0c;以“智能云原生一体化——DB 与 AI 协…

28个常用的损失函数介绍以及Python代码实现总结

28个常用的损失函数介绍以及Python代码实现总结 最近在做多分类的研究&#xff0c;总是遇到这么多损失函数&#xff0c;应该挑选哪一个损失函数呢&#xff1f;这样的问题。于是心血来潮便想着对损失函数进行总结。 以下是一个预览总结&#xff1a; 损失函数名称问题类型L1范…

缓冲器的重要性,谈谈PostgreSQL

目录 一、PostgreSQL是什么二、缓冲区管理器介绍三、缓冲区管理器的应用场景四、如何定义缓冲区管理器 一、PostgreSQL是什么 PostgreSQL是一种高级的开源关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它以其稳定性、可靠性和高度可扩展性而闻名。它最初由加…

网络安全设备——防火墙

网络安全设备防火墙是一种用来加强网络之间访问控制的特殊网络互联设备。以下是对防火墙的详细解释&#xff1a; 一、定义与基本概念 定义&#xff1a;防火墙是指设置在不同网络&#xff08;如可信任的企业内部网和不可信的公共网&#xff09;或网络安全域之间的一系列部件的…

EOF 为 (End Of File) 的缩写 , 值通常为 -1

EOF是一个计算机术语&#xff0c;为 End Of File 的缩写 EOF 的值通常为 -1 EOF 的值通常为 -1&#xff0c;但它依系统有所不同。巨集 EOF会在编译原始码前展开实际值给预处理器。 与 feof 与 feof C语言中&#xff0c;当把数据以二进制形式存放到文件中时&#xff0c;就会有…