当前位置: 首页 > 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():显示的将左值转换为对应的右值引用类型

相关文章:

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

数据类型: 作用:决定变量所占内存空间的字节大小,和布局方式基本数据类型: 算数类型: 整形(bool / char……扩展集 / int / long……)&& 浮点形(float/double……&#xff…...

发那科机器人IO 分配

IO 信号 也称为输入\输出信号,是机器人与外围设备通信的电信号...

ubuntu开机怎么进入、退出命令行界面

要在Ubuntu系统开机时进入命令行界面,可以按照以下步骤操作: 在开机过程中按下Ctrl Alt F1组合键,这将会切换到第一个虚拟控制台,即命令行界面。如果Ctrl Alt F1没有生效,也可以尝试Ctrl Alt F2、Ctrl Alt F3…...

『FPGA通信接口』LVDS接口(4)LVDS接收端设计

文章目录 1.LVDS接收端概述2逻辑框图3.xapp855训练代码解读4.接收端发送端联调5.传送门 1.LVDS接收端概述 接收端的传输模型各个属性应该与LVDS发送端各属性一致,例如,如果用于接收CMOS图像传感器的图像数据,则接收端程序的串化因子、通道个…...

面试题:HTTP的body是二进制还是文本

实际上,HTTP的body可以是二进制数据,也可以是文本。HTTP协议本身不对body内容的格式做限制,具体格式取决于Content-Type头字段的定义。 文本数据: 当Content-Type头字段指定为文本类型时(如text/plain、text/html、ap…...

5分钟带你部署一套Jenkins持续集成环境​

5分钟带你部署一套Jenkins持续集成环境 Jenkins是开源CI&CD软件领导者, 提供超过1000个插件来支持构建、部署、自动化, 满足任何项目的需要。 Jenkins的优点 持续集成和持续交付 作为一个可扩展的自动化服务器,Jenkins 可以用作简单的 CI…...

OpenAI突然宣布停止向中国提供API服务!

标题 🌟 OpenAI突然宣布停止向中国提供API服务! 🌟摘要 📜引言 📢正文 📝1. OpenAI API的重要性2. 停止服务的原因分析3. 对中国市场的影响4. 应对措施代码案例 📂常见问题解答(QA)❓…...

Bootstrap 标签

Bootstrap 标签 引言 Bootstrap 是一个流行的前端框架,它提供了一套丰富的组件和工具,帮助开发者快速构建响应式和移动优先的网页。在 Bootstrap 中,标签(Badge)是一种小巧的组件,用于显示计数、提示或标…...

EtherCAT主站SOEM -- 37 -- win-soem-win10及win11系统QT-SOEM-1个电机转圈圈-周期同步速度模式(CSV模式)

EtherCAT主站SOEM -- 37 -- win-soem-win10及win11系统QT-SOEM-1个电机转圈圈-周期同步速度模式(CSV模式) 0 QT-SOEM及STM32F767-SOEM视频欣赏及源代码链接:0.1 Linux--Ubuntu系统之 QT-SOEM博客、视频欣赏及源代码链接0.2 STM32F767-SOEM 博客、视频欣赏及源代码链接0.3 wi…...

老板舍不得买库存管理软件❓一招解决

在当今快节奏的商业环境中,仓库管理是企业运作中不可或缺的一环。对于许多中小型企业而言,简易且高效的库存管理系统尤为重要。搭贝简易库存管理系统针对仓库的出入库进行有效管理,帮助企业实现库存的透明化和流程的自动化。 客户的痛点 1. …...

【MySQL数据库】:MySQL视图特性

目录 视图的概念 基本使用 准备测试表 创建视图 修改视图影响基表 修改基表影响视图 删除视图 视图规则和限制 视图的概念 视图是一个虚拟表,其内容由查询定义,同真实的表一样,视图包含一系列带有名称的列和行数据。视图中的数据…...

malloc、free和new delete的区别

malloc/free 和 new/delete 是在 C 中分配和释放内存的两种不同方法。它们主要有以下区别: 1. 语法和用法 malloc 和 free: malloc开辟空间时需要手动计算分配的空间大小 int* p (int*)malloc(sizeof(int) * 10); // 分配10个int类型的内存 // 使用内存 free(p); …...

如何有效地优化 Erlang 程序的内存使用,以应对大规模数据处理的需求?

要有效地优化Erlang程序的内存使用,以应对大规模数据处理的需求,可以考虑以下几个方面: 减少不必要的内存分配:避免过多的数据复制和不必要的数据结构创建。可以使用Erlang的二进制数据类型来避免数据复制,使用原子数据…...

vue3项目使用@antv/g6实现可视化流程功能

文章目录 项目需求一、需要解决的问题二、初步使用1.动态数据-组件封装(解决拖拽会留下痕迹的问题,引用图片,在节点右上角渲染图标,实现,事现旋转动画,达到loading效果)2.文本太长,超出部分显示(...),如下函…...

【Linux网络(一)初识计算机网络】

一、网络发展 1.发展背景 2.发展类型 二、网络协议 1.认识协议 2.协议分层 3.OSI七层模型 4.TCP/IP协议 三、网络传输 1.协议报头 2.局域网内的两台主机通信 3.跨网络的两台主机通信 四、网络地址 1.IP地址 2.MAC地址 一、网络发展 1.发展背景 计算机网络的发展…...

Vulhub——Log4j、solr

文章目录 一、Log4j1.1 Apache Log4j2 lookup JNDI 注入漏洞(CVE-2021-44228)1.2 Apache Log4j Server 反序列化命令执行漏洞(CVE-2017-5645) 二、Solr2.1 Apache Solr 远程命令执行漏洞(CVE-2017-12629)2.…...

linux 设置程序自启动

程序随系统开机自启动的方法有很多种, 这里介绍一种简单且常用的, 通过系统的systemd服务进行自启动。 第一步: 新建一个.service文件 sudo vim /etc/systemd/system/myservice.service[Unit] DescriptionMy Service #Afternetwork.target[…...

PostgreSQL 分区表与并行查询(十)

1. 分区表概述 1.1 什么是分区表 分区表是将大表分割成更小、更可管理的部分的技术。每个分区表都可以单独进行索引和查询,从而提高查询性能和管理效率。 1.2 分区策略 1.2.1 基于范围的分区 按照时间范围或者数值范围进行分区,如按月或按地区。 C…...

React Hooks使用规则:为什么不在条件语句和循环中使用它们

React Hooks为函数组件引入了状态和生命周期特性,极大地增强了其功能。然而,正确使用Hooks是确保组件稳定性和性能的关键。本文将探讨React Hooks的基本规则,以及为什么我们不应该在条件语句和循环中使用它们。 Hooks的基本规则 React团队为…...

【Docker】Consul 和API

目录 一、Consul 1. 拉取镜像 2. 启动第一个consul服务:consul1 3. 查看consul service1 的ip地址 4. 启动第二个consul服务:consul2, 并加入consul1(使用join命令) 5. 启动第三个consul服务:consul3&…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Zustand 状态管理库:极简而强大的解决方案

Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

电脑插入多块移动硬盘后经常出现卡顿和蓝屏

当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

如何为服务器生成TLS证书

TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】

1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/

使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...

深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用

文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析,分为​​已启动​​和​​未启动​​两种场景: 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​:当其他组件(如Activity、Service)通过ContentR…...