每天一点C++——杂记

这篇具有很好参考价值的文章主要介绍了每天一点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关键字修饰的函数或者是函数内部定义的函数都可能是内联函数,但是具体会不会展开还需要编译器决定。文章来源地址https://www.toymoban.com/news/detail-416795.html

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

到了这里,关于每天一点C++——杂记的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • node.js知识系列(2)-每天了解一点

    👍 点赞,你的认可是我创作的动力! ⭐️ 收藏,你的青睐是我努力的方向! ✏️ 评论,你的意见是我进步的财富! 在 Node.js 中,您可以使用 child_process 模块来执行子进程。这允许您在 Node.js 应用程序中启动外部命令或脚本,与它们进行交互并获取输出。 以下是一个简单

    2024年02月07日
    浏览(43)
  • 【每天学习一点新知识】中间人攻击是什么

    目录 中间人攻击介绍  中间人攻击原理 1. ARP欺骗 2. DNS欺骗 防御方法   中间人攻击(man-in-the-middle attack, abbreviated to MITM),顾名思义,就是攻击者躲在通信双方之间,窃听甚至篡改通信信息,而这个攻击是不可见的,通信双方并不知道消息已经被截获甚至篡改了。 这个图片很

    2024年02月09日
    浏览(43)
  • 【每天学习一点新知识】文件包含常用之伪协议

    以下举例一些比较常用的伪协议及用法 可以用于执行php代码,通过post请求提交我们的代码 这里给一个攻防世界 Web_php_include 的例子 $page=str_replace(\\\"php://\\\", \\\"\\\", $page);这里把page参数里的php://替换成了空格,我们需要绕过它 用php://input执行ls命令查看文件,php用大小写来绕过 结果如

    2024年02月13日
    浏览(44)
  • C语言编程实现,计算每天进步一点点一年后的效果

    本来的基数为1,如果好好学习时能力值相比前一天提高1%,当放任时相比前一天下降1%。1年(365天)后的效果相差多少呢? 原基数为1,努力一天进步1%,效果1*(1+0.01),努力两天是在前一天的基础上进步1%,结果是1*(1+0.01)*(1+0.01),一年后天天向上的力量是(1+0.01)的365次方。

    2024年02月11日
    浏览(57)
  • 关于credal set和credal decision tree的一点思考(其实就是论文笔记)

    阅读Abellán老师的Credal-C4.5时,发现好难。。。然后又额外补充了一些论文,终于稍微懂一点点了,所以记录如下。 credal set在DS theory的定义如下 [1]: 这句话的意思是(证据理论中的)credal set是一个概率的凸集,这里面的概率p(x)受到上界pl函数和下界bel函数的控制(约束),

    2024年02月12日
    浏览(46)
  • 【每天学习一点新知识】Windows下命令行echo如何换行实现多行文本输出

    刚开始在网上搜了很多资料,都说echo -e可以实现特殊字符的处理 echo -e \\\"字符串c\\\" echo -e 处理特殊字符; 可接的特殊字符有 c 最后不加上换行符号; f 换行但光标仍旧停留在原来的位置; n 换行且光标移至行首; r 光标移至行首,但不换行; t 插入tab; v 与f相同; \\\\ 插入

    2024年02月13日
    浏览(44)
  • 6.6---每天一点点--- Java基础之==和equals区别并举例说明(总复习+深入版)---详细+举例(小白也能看懂)

    1.== 为运算符,equal 为String数据类型的比较方法 相同内容的对象地址不一定相同,但相相同地址的对象内容一定相同;== 比较的是值是否相等,equal比较的是是否是同一个对象 2.把对象想象成一个房子,而引用则是门牌号。如果两个引用指向同一个房子,那么它们就是相等的

    2024年02月08日
    浏览(43)
  • C++教程——const修饰指针、结构体、文件操作

    读取数据的方式 写文件 读文件

    2024年02月13日
    浏览(35)
  • 【每天学习一点点 day04】工程化 npm create 脚手架 create-vue, vue-cli 执行原理① - npm cli

    希望我们每个人都能找到属于自己的花期,不急不躁,静等风来。 今天打算用 Docusaurus 开始搭建自己的知识库,之前早已有此想法,遗憾的是没有坚持下来。 这次借助这个机会,也计划将自己【每天学习一点点】系列整理在自己的知识库中,方便大家查找。 在使用脚手架命

    2024年02月22日
    浏览(68)
  • 3,this指针、深拷贝浅拷贝、namespace的使用

    定义:当前类指向自己地址的常量指针 指针被const修饰,指针指向的内容不能修改 this指针-》类 对象 占不占用大小? this指针不占用类的大小,因为是编译器去传递的 this指针-》地址 地址里面放的是什么? 存放的是对象的首地址 静态的 非静态的 静态的成员函数没办法操作

    2024年02月15日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包