当前位置: 首页 > news >正文

C++ 左值右值 || std::move() || 浅拷贝,深拷贝 || 数据类型

数据类型:

  1. 作用:决定变量所占内存空间的字节大小,和布局方式
  2. 基本数据类型:
    1. 算数类型:
      1. 整形(bool / char……扩展集 / int / long……)&& 浮点形(float/double……)
        1. 部分整形(除了bool && char的扩展集)会有更多的划分:
        2. 例如:int( int 有符号/ unsigned int无符号) ……
        3. 对于char(8bit):(char / signed char有符号-128---127 / unsigned char无符号0----256)
    2. 空类型void
  3. 复合类型:声明符/类型修饰符:(& / * / const…… ) + 基本数据类型
  4. 其他类型:对象(类/结构体)类型……

字面值常量:

  1. 定义:直接看就可以得到它的值,一望而知
  2. 这样的常量非常常见,如何知道它的类型?
  3. 字面值常量的数据类型:由本身决定,不用手动定义,由常量的形式和值决定
    1. 整形:可以写做二进制、十进制,八进制、十六进制
      1. 如何看整形的数据类型:
        1. 默认情况下:十进制(signed),八进制、十六进制(signed  / unsigned)
        2. 默认为算数类型int,也可以为long / long long,具体要在可以容纳当前值的情况下,取最小尺寸
        3. 其中short不能作为整形字面值的类型
    2. 浮点:默认为double类型的字面值
    3. 字符:‘ ’为char类型,
    4. 字符串:“ ”为const char* 类型->常量字符数组[],其中会在字符串末尾添加"\0"空字符
    5. 指针:   nullptr为指针类型字面值
    6. 布尔:true / false为bool类型字面值

变量:

  1. 对象:有具体类型,并且能存储数据,的内存空间

表达式:

  1. 概念:由一个或多个运算对象组成(不一定有运算符,比如:字面值42 / 常量a的值
  2. 一元/二元/三元/运算符:作用于 一/二/三 个运算对象
  3. 函数调用:fun();也算作特殊运算符
  4. 复杂表达式:含有多个运算符,计算方式:遵守:优先级,结合律,求值顺序

左值&&右值

  1. 左值:(存储在栈)
    1. 对象(持久对象)
    2.  变量,常量,数组,指针,引用,表达式……
    3. 对于常量,不能作为赋值语句的左侧
  2. 右值:(存储在寄存器)
    1. 具体数据(临时对象)
    2. 常量,表达式(变量的值),临时对象……
  3. 赋值=:要求左侧为可修改的左值(除了const),右侧为右值
  4. 表达式可以作为左值;用的是在内存的地址
  5. 也可以作为右值:使用的是内存的地址中存储的值(变量存储的id,对应的val)
  6. 注意赋值=语句中:左值可以被当作右值使用(它的值),右值(非对象)不能作为左值被赋值
  7. 作用:……

运算符与左值右值的关系:

  1. 运算对象:
    1. 要求左值:赋值的左侧,&取地址(取对象地址),*解引用,   递增递减
    2. 要求右值:……
  2. 返回值:
    1. 要求左值:赋值,*解引用(获取指针所指向地址上的对应的值),递增递减
    2. 要求右值:取地址(指向运算对象的指针)
  3. 因此,对于decltype()会根据()括号内是什么运算符,确定返回值
  4. 比如:&返回右值--type*类型,*返回左值----type&

浅拷贝 && 深拷贝

  1. 浅拷贝(默认拷贝构造):只复制对象内的基本数据类型的成员变量,而不复制对象内的指针成员变量所指向的内存空间id(指针同时指向一个地址)
  2. 深拷贝:会同时复制对象内的基本数据类型的成员变量和指针成员变量所指向的内存空间
  3. 浅拷贝的问题
    1. 内存泄漏:
      1. 同一个内存多次释放:由于浅拷贝导致多个对象共享同一块内存,当这些对象在析构时都会尝试释放这块内存,导致同一块内存被多次释放
    2. 空悬指针:
      1. 当浅拷贝的对象中的一个对象提前释放,其持有的内存会被释放,而其他对象仍持有指向该内存的指针,这些指针就变成了空悬指针
    3. 数据不一致:当其中一个对象修改这块内存中的数据时,其他对象的对应数据也会被同时修改,导致数据不一致的问题
  4. 如何避免:
    1. 使用智能指针:std::shared_ptrstd::unique_ptr
    2. 自定义拷贝构造函数
    3. 自定义赋值运算符
  5. 优缺点
    1. 浅拷贝节约内存操作和时间开销,但是会导致指针问题。
    2. 深拷贝需要更多的内存操作和时间开销,深拷贝通常是更安全、更可靠

拷贝构造 && 拷贝赋值:

  1. 实现类对象复制的两种特殊成员函数
  2. 拷贝构造,使用一个已存在的对象来初始化一个新对象时
  3. 拷贝赋值:将一个对象赋值给另一个已经存在的对象时

移动对象

  1. 移动对象:不会发生拷贝,大幅度提升性能
  2. 右值引用:
    1. &&绑定到右值的引用,绑定的为右值---将要销毁的对象
    2. 同时普通引用&为了方便区分,为左值引用(绑定的为左值---对象)
    3. 变量的值当作为表达式时可以有右值属性,但变量本身是左值,所以不能作为&&右值引用的绑定
    4. 作用:
      1. 移动语义:直接从临时对象中转移资源,而非通过拷贝
      2. 完美转发:参数的类型(左值或右值)和值类别(临时或持久)都能被正确无误地传递给目标函数
      3. 提高程序运行效率
  3. std::move():显示的将左值转换为对应的右值引用类型
http://www.lryc.cn/news/383014.html

相关文章:

  • 发那科机器人IO 分配
  • ubuntu开机怎么进入、退出命令行界面
  • 『FPGA通信接口』LVDS接口(4)LVDS接收端设计
  • 面试题:HTTP的body是二进制还是文本
  • 5分钟带你部署一套Jenkins持续集成环境​
  • OpenAI突然宣布停止向中国提供API服务!
  • Bootstrap 标签
  • EtherCAT主站SOEM -- 37 -- win-soem-win10及win11系统QT-SOEM-1个电机转圈圈-周期同步速度模式(CSV模式)
  • 老板舍不得买库存管理软件❓一招解决
  • 【MySQL数据库】:MySQL视图特性
  • malloc、free和new delete的区别
  • 如何有效地优化 Erlang 程序的内存使用,以应对大规模数据处理的需求?
  • vue3项目使用@antv/g6实现可视化流程功能
  • 【Linux网络(一)初识计算机网络】
  • Vulhub——Log4j、solr
  • linux 设置程序自启动
  • PostgreSQL 分区表与并行查询(十)
  • React Hooks使用规则:为什么不在条件语句和循环中使用它们
  • 【Docker】Consul 和API
  • Python polars学习-07 缺失值
  • 前端面试题(八)答案版
  • 在交易中出场比入场更为重要
  • 【D3.js in Action 3 精译】关于本书
  • 【408考点之数据结构】二叉树的概念与实现
  • STM32之二:时钟树
  • 第十四站:Java玫瑰金——移动开发(第二篇)
  • 数据处理技术影响皮质-皮质间诱发电位的量化
  • ResultSet的作用和类型
  • 计算机网络:运输层 - TCP首部格式 连接的创建与释放
  • 妈耶!被夸爆的零售数据分析方案在这里