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

每天一点C++——杂记

结构体的深拷贝和浅拷贝

浅拷贝就是只拷贝指针,并不拷贝指针所指向的内容,深拷贝则会对指针的内容进行拷贝。浅拷贝会在一些场景下出现问题,看下面的例子:

struct s {char * name;int age;
};

如果我定义 一个对象s1,并且为name申请一块内存并赋值为“zhangsan”,然后定义对象s2=s1,然后修改s2的name值会发生什么情况?

重载实现原理

重载可以让相同名称的函数具有不同的实现,可以通过参数的数量,参数类型,参数顺序等来区分,但是不能够只通过返回值来判断。
重载是原理就是基于编译器name Mangling机制,在编译阶段会为所有函数生成一个唯一的标识符用来区分不同函数。通过编译器将具有相同名称不同参数的函数会根据名称加参数生成唯一的标识符,并在执行时调用,这也叫静态联编。
这里的name mangling 机制是:前缀 _Z是GCC的规定(写gcc编译器人员规定的),数字3 是函数名Add的字符个数,i表示第一个函数的参数类型int,i是第二个函数的参数类型int。对于第二个函数签名中Pi则表示第三个函数类型是int*

因为C编译器的name mangling规则与C++的不同:C语言的命名规则仅依赖于函数名,和函数参数类型无关。因为同名函数没办法区分。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。

const

const用来标记一个变量是不可修改的,主要使用的场景有:

  • 修饰变量
  • 修饰指针
  • 修饰引用
  • 修饰函数参数
  • 修饰函数返回值
  • 修饰类成员函数

对应的还要一个constexpr 表示这个一个常量表达式,可以在编译阶段计算出来

指针和引用的区别

  • 引用在声明时必须赋值,指针不需要
  • 引用赋值后不可以修改,指针可以
  • 引用不可以为空值,指针可以

虚函数、纯虚函数、抽象类

虚函数

虚函数并不是不实现的函数,而是允许基类指针可以调用子类的该函数。用来实现多态,虚函数只能借助于指针或者引用来达到多态的效果。

纯虚函数

如果一个函数为纯虚函数,则代表该函数没有实现,只是定义了一个接口,规定继承该类的子类必须实现该函数。

抽象类

带有纯虚函数的类称为抽象类。抽象类不能够定义对象,如果子类不是先纯虚函数则子类也是一个抽象类。

虚继承

解决菱形继承的问题。解决命名冲突和冗余数据问题, 使得在派生类中只保留一份间接基类的成员。

四种cast

reinterpret_cast

reinterpret_cast是功能最强大的cast,但也是最暴力,最底层,最不安全的,他是一个编译器指令,将对应的地址转换解释的方式。
可以将一个int转换为指针,也可以将指针转换为int,也可以实现不同类型指针之间的转换。
reinterpret_cast是底层二进制的强制拷贝和语义转换不会损失精度。

const_cast

修改变量的const属性。

  • 如果是添加const,则是先进行一个深拷贝然后赋值
  • 如果是去掉const

static_cast

  • 基本类型之间转换
  • void指针转换为任意基本类型指针
  • 子类或父类之间引用或指针的转换,向下转换父类转子类是不安全的,子类转父类是安全的

dynamic_cast

dynamic_cast用于类继承层次间的指针或引用转换(主要用于向下的安全转换)。dynamic_cast向下转型的安全性主要体现在RTTI运行时类型识别。无法转型返回NULL。

auto_ptr, unique_ptr, shared_ptr, weak_ptr

只能指针用于解决内存正确释放的问题,它负责自动释放所指向的对象

auto_ptr:

unique_ptr

某个时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr 被销毁时,它所指向的对象也被销毁。

初始化

没有shared_ptr中make_shared标准库函数返回一个unique_ptr,我们定义一个unique_ptr需要绑定到new返回的指针上,并且不能通过=赋值的方式,要采用直接赋值方式,unique_ptr p1(new A()).

release,reset

禁止拷贝和赋值

因为该指针指向的对象只能有一个unique_ptr指针,也就是一个引用计数, 因此不支持普通的拷贝和赋值。特殊情况,一个即将销毁的unique_ptr可以拷贝或者赋值给另一个unique指针。

shared_ptr

作用

消除野指针,重复释放,内存泄漏等问题。

基本原理

记录对象的引用次数,当引用次数为0的时候,也就是最后一个共享指针析构的时候,会把指向的内存释放掉。

常用函数

  • get
  • use_count
  • reset
  • operator*
  • operator->

注意事项

  • 多线程的读写安全
  • 要谨慎使用get
  • 不要用栈内的指针构造shared ptr,因为共享指针是通过delete来释放内存,需要对应到new出的内存才可以
  • 不要用原始指针初始化多个共享指针

weak_ptr:

创建weak_ptr, 需要使用shared_ptr,反过来是行不通的,需要使用lock函数; weak_ptr不会增加引用计数; 解决shared_ptr循环引用,将其中一个改为weakptr即可

内联函数

inline关键字修饰的函数或者是函数内部定义的函数都可能是内联函数,但是具体会不会展开还需要编译器决定。

  • 内联函数是以代码膨胀为代价的,如果内联函数内有循环或者代码较长,执行时间比调用时间更长
  • 代码膨胀后会消耗更多的内存

相关文章:

每天一点C++——杂记

结构体的深拷贝和浅拷贝 浅拷贝就是只拷贝指针,并不拷贝指针所指向的内容,深拷贝则会对指针的内容进行拷贝。浅拷贝会在一些场景下出现问题,看下面的例子: struct s {char * name;int age; };如果我定义 一个对象s1,…...

Document Imaging SDK 11.6 for .NET Crack

Document Imaging SDK for .NET View, Convert, Annotate, Process,Edit, Scan, OCR, Print 基本上被认为是一种导出 PDF 解决方案,能够为用户和开发人员提供完整且创新的 PDF 文档处理属性。它具有提供简单集成的能力,可用于增强用户 .NET 的文档成像程…...

数据挖掘(3.1)--频繁项集挖掘方法

目录 1.Apriori算法 Apriori性质 伪代码 apriori算法 apriori-gen(Lk-1)【候选集产生】 has_infrequent_subset(c,Lx-1)【判断候选集元素】 例题 求频繁项集: 对于频繁项集L{B,C,E},可以得到哪些关联规则: 2.FP-growth算法 FP-tre…...

2023年信息安全推荐证书

随着网络安全行业的不断升温,相关的认证数量也不断增加,对于在网络安全行业发展的人才来说,提升职业竞争力最有效的办法之一,就是取得权威认证。 那么如何从繁多的适合网络安全从业者的证书中选择含金量高、发展潜力大的证书&…...

基于ArcGIS、ENVI、InVEST、FRAGSTATS等多技术融合提升环境、生态、水文、土地、土壤、农业、大气等领域应用

【自选】 时间地点:2023年7月22日-28日【乌鲁木齐】时间地点:2023年8月12日-18日【福建泉州】 【六天实践教学、提供全部资料】 专题一、空间数据获取与制图 1.1 软件安装与应用讲解 1.2 空间数据介绍 1.3海量空间数据下载 1.4 ArcGIS软件快速入门…...

基于ZC序列的帧同步

Zadoff-Chu序列是一种特殊的序列,具有良好的自相关性和很低的互相关性,这种性能可以被用来产生同步信号,作为对时间和频率的相关运算在TD-LTE系统中,Zadoff-Chu(ZC)序列主要应用于上行RS序列生成、PRACH前导序列生成以及主同步信号…...

配置NFS服务器-debian

NFS(Network Files System)是网络文件系统的英文缩写,由Sun公司于1980年开发,用于在UNIX操作系统间实现磁盘文件共享。在Linux操作系统出现后,NFS被Linux继承,并成为文件服务的一种标准。 通过网络,NFS可以在不同文件…...

正点原子STEMWIN死机

在用正点原子STM32F4开发板,搭配对应的button历程时,发现运行一会,button都无法使用了,以为是emwin死机了,但是看到Led还在闪烁,排除系统死机问题。那就是emwin的任务没有运行起来,但是打断点后…...

PMP考试中的固定答题套路

1、掌握PMBOK 编制的逻辑(整范进,成质资,沟风采,相) 2、事实求是,项目经理该怎么做就怎么做,不能违背职业道德。 3、PM 做事流程(5 步法): ①收集信息&…...

STM32 学习笔记_2 下载,GPIO 介绍

下载 Keil 编译例程 编译两个按钮,一个向下是部分编译,两个向下箭头是全部编译。对于未编译文件两个按钮等效。 点击编译后,linking 是链接,结果里面的几个数据的意义代表大小: 数据类型占用Flash or SRAM说明Code…...

Centos搭建k8s

在CentOS 7上搭建Kubernetes集群 kubeadm官方文档 https://blog.51cto.com/zhangxueliang/4952945 前置步骤(所有结点) CentOS 7.9 物理机或虚拟机三台,CPU 内核数量大于等于 2,且内存大于等于 4Ghostname 不是 localhost&…...

Flutter Flex(Row Column,Expanded, Stack) 组件

前言 这个Flex 继承自 MultiChildRenderObjectWidget,所以是多子布局组件 class Flex extends MultiChildRenderObjectWidget {} Flex 的子组件就是Row 和 Column , 之间的区别就是Flex 的 direction 设置不同。 它有两个轴,一个是MainAxis 还有一个是交…...

《深入探讨:AI在绘画领域的应用与生成对抗网络》

目录 前言: 一 引言 二 生成对抗网络(GAN) 1 生成对抗网络(GAN)简介 2.使用GAN生成艺术作品的实现方法 3,生成图像 三 GAN在艺术创作中的应用 1 风格迁移 2 图像生成: 3 图像修复: 四 使…...

al文章生成-文章生成工具

ai文章生成器 AI文章生成器是一种利用人工智能和自然语言处理技术生成文章的工具。它使用先进的算法、机器学习和深度学习技术,深度挖掘和提取大量数据背后的信息,自主学习并合并新的信息,生成优质、原创的文章。 使用AI文章生成器的优点如下…...

【云原生之Docker实战】使用docker部署webterminal堡垒机

【云原生之Docker实战】使用docker部署webterminal堡垒机 一、webterminal介绍1.webterminal简介2.webterminal特点二、检查本地docker环境1.检查docker版本2.检查操作系统版本3.检查docker状态4.检查docker compose版本三、下载webterminal镜像四、部署webterminal1.创建安装目…...

《低代码PaaS驱动集团企业数字化创新白皮书》-IDC观点

IDC观点 大型集团企业应坚定地走数字化优先发展道路,加深数字化与业务融合 大型企业在长期的经营发展中砥砺前行,形成了较为成熟的业务模式和运营流程,也具备变革 管理等系统性优势。在数字化转型过程中,其庞大的组织架构、复杂的…...

LoRA 指南之 LyCORIS 模型使用

LoRA 指南之 LyCORIS 模型使用 在C站看到这个模型,一眼就非常喜欢 在经历几番挣扎之后终于成功安装 接下来,我们一起开始安装使用吧! 1、根据原作大佬的提示,需要安装两个插件 https://github.com/KohakuBlueleaf/a1111-sd-web…...

[C#]IDisposable

在C#中,继承IDisposable接口的主要作用是在使用一些需要释放资源的对象时,可以显式地管理和释放这些资源,以避免内存泄漏和其他潜在问题。 如果一个类继承了IDisposable接口,那么该类就必须实现Dispose方法。在该类的实例不再需要…...

ROS开发之如何使用RPLidar A1二维激光雷达?

文章目录0.引言1.创建工作空间2.获取rplidar_ros包并编译3.检查雷达端口4.启动launch显示雷达扫描结果0.引言 笔者研究课题涉及多传感器融合,除了前期对ROS工具的学习,还需要用雷达获取数据,进行点云处理。虽然激光雷达已经应用很广泛&#x…...

【谷粒商城之JSR303数据校验和集中异常处理】

本笔记内容为尚硅谷谷粒商城JSR303数据校验和集中异常处理部分 目录 一、简介 二、SR303数据校验使用步骤 1、引入依赖 2、给参数对象添加校验注解 常见的注解 3、接口参数前增加Valid 开启校验 三、异常的统一处理 四、分组解决校验 1、创建Groups 2、添加分组 …...

内存分配函数malloc kmalloc vmalloc

内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​: 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​: // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...

MySQL:分区的基本使用

目录 一、什么是分区二、有什么作用三、分类四、创建分区五、删除分区 一、什么是分区 MySQL 分区(Partitioning)是一种将单张表的数据逻辑上拆分成多个物理部分的技术。这些物理部分(分区)可以独立存储、管理和优化,…...

从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障

关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...

Mac flutter环境搭建

一、下载flutter sdk 制作 Android 应用 | Flutter 中文文档 - Flutter 中文开发者网站 - Flutter 1、查看mac电脑处理器选择sdk 2、解压 unzip ~/Downloads/flutter_macos_arm64_3.32.2-stable.zip \ -d ~/development/ 3、添加环境变量 命令行打开配置环境变量文件 ope…...