
C++
文章平均质量分 76
C++
BearPot
你太容易因为别人优秀而焦虑 你需要的是平静的把自己的事做好
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
从CPU的视角看C++的构造函数和this指针
设置新的基址指针,指向当前栈帧。:将this指针(存储在rdi中)保存到栈上。:将this指针的值加载到rax中。:将edx(即_a的值)存储到this->a中。我们从类成员函数和构造函数中都能看到 两句关于参数的汇编,同理普通函数中px参数也有着相同的汇编,那么很显然,原创 2024-07-05 19:38:55 · 1091 阅读 · 0 评论 -
function实现原理
【代码】function实现原理。原创 2023-09-30 17:25:57 · 168 阅读 · 0 评论 -
手搓CAS原理实现/ 模拟mutex的lock和unlock
cas有可能会有aba的问题,解决方法:加版本号,每次数据操作就更新版本号,最后比对版本号,, 或者用加时间戳。flag的0表示现在没上锁,1表示已经上锁了。通过cas去实现自旋锁。原创 2023-09-20 22:38:37 · 251 阅读 · 0 评论 -
C++位域
而这种数据结构的缺点在于,位段实现依赖于具体的机器和系统,在不同的平台可能有不同的结果,这导致了位段在本质上是不可移植的。在一个 “联合” 内可以定义多种不同的数据类型, 一个被说明为该 “联合” 类型的变量中,允许装入该 “联合” 所定义的任何一种数据,这些数据共享同一段内存,以达到节省空间的目的。一个位域成员不允许跨越两个 unsigned int 的边界,如果成员声明的总位数超过了一个 unsigned int 的大小, 那么编辑器会自动移位位域成员,使其按照 unsigned int 的边界对齐。原创 2023-08-24 19:45:32 · 237 阅读 · 0 评论 -
有关using在C++11中继承构造的使用
鲤鱼哥的博客写的很好。原创 2023-05-13 23:36:52 · 171 阅读 · 1 评论 -
模拟简单的string,循环队列,vector
下面的空间配置器就是模仿C++标准库的alloctor实现的,封装了malloc和free。对这感兴趣的可以去看看SGI STL的两级的配置器,一级的就像我写的这种,二级用到了内存池的实现。STL源码是把内存分配和对象的构建分开来的,同样的对象析构和内存释放分开,这样才能满足类类型的构建,不明白的可以去了解下空间配置器。给出昨晚抽空写的简单的string,queue,示例代码,,适合刚开始学习C++接触到类的人群。vector的调用实现,测试代码自己测一下就行,我这不写了。原创 2023-04-29 11:45:00 · 156 阅读 · 0 评论 -
有关传值和传地址的问题
最近写项目的过程里,碰到个传地址进入的小问题,虽然解决了,不是什么问题,但是想想自己最初学编程的时候对于指针这块的头大,就想着还是写个小demo记录一下,让刚刚学习编程的人可以明白传值和传地址是个怎么回事?打印地址发现,p和ptr指向的都是a这块内存,但是p和ptr本身地址不同,且p最后修改了指向,p的指向地址改变而ptr不变,都能说明p是ptr的一份拷贝。实参和行参都指向同一个对象,因此对于解引用之后都是指向同一块内存,对于解引用后形参的改变当然能去改变实参的值了。传引用 是真正的以地址的方式传递参数。原创 2023-02-08 11:33:52 · 516 阅读 · 1 评论 -
类模板的友元
写之前给不知道友元的小伙伴说一声:友元不受public/private影响,他只是定义在类外部的普通函数或类,可以访问类中private成员;友元声明只能出现在类定义中 ,在外面去定义实现。C++的泛型编程真的是复杂,最近再看一些代码的时候涉及一些模板相关的地方,有的写法因为自己没咋用过看着就很陌生,这节就聊聊类模板的友元的各个形式写法。有关模板的文章之前写过一个可变参数的,感兴趣的可以看看。这是一个普通类的写法。原创 2023-01-16 18:19:08 · 532 阅读 · 0 评论 -
一步一步改写Observer观察者模式
2. 运行示例程序,可以看到当原始数据 Subject 处于状态 “false” 时候,依赖于它的两个观察者都显示 “false”,当原始数据状态改变为 “true” 的时候,依赖于它的两个观察者也都改变为“true”。如果说员工没有加班,上下班不需要请示,那么秘书这个通知者就以weak_ptr去管理,因为有可能秘书下班了,员工还没有下班,员工的存活秘书管不着。具体的通知者根据具体要求有着自己的Notify通知的函数,同理不同的观察者对于响应通知之后有着自己不同的update更新方式。的操作Notify。原创 2022-12-30 17:00:02 · 525 阅读 · 0 评论 -
Summary单例模式
如果把instance换成类对象的指针,不在拷贝副本节省资源,可以减少全局数据区的占用量,把单例对象放在了堆中,不过析构不会被调用,释放不了资源。但是当线程很少,甚至是没有用到这个单例类的时候,就显得得不偿失了,它占用的空间问题就体现出来了,这是一种空间换时间的模式。内部的静态类只有第一次使用的时候才会被装载,这个其实是栈上创建的实例的是个类对象,刚开始链接粘的是在堆上创建的因为我们实例的是类对象的指针,懒汉模式适用于线程比较少的场景,因为线程一旦多,加锁的开销就会体现出来(不过我上面写的。原创 2022-12-27 20:33:50 · 311 阅读 · 1 评论 -
有关enable_shared_from_this
解决在类的内部去返回一个指向当前对象的share_ptr,使得返回的这个share_ptr能够正常关联,使得引用计数正常+1;但是要用这个weak_ptr就需要一个shared_ptr去初始化这个weak_ptr。所以继承enable_shared_from_this这个类,去解决this问题就得先去构造share_ptr。(weak_ptr类型),每次shared_from_this都是拷贝构造内部的。enable_shared_from_this这个类的源码里面具有一个数据成员。原创 2022-12-12 23:21:57 · 400 阅读 · 0 评论 -
有关C++的异常机制
异常在C++用于错误处理,C语言中一般使用返回值表示错误,C++对于错误处理进行了拓展,统一使用异常机制来处理程序中发生的错误。那么我们写程序不可能明知道可能会有异常,把错误专门扔出来放着,让他把程序干死,我们肯定是需要一些去处理这个被抛出异常的方法的。如果上面代码随机值取完rand后是1 2 3随便一个,他就会抛出异常,把程序干死,就像下面一样。如果抛出的异常被捕获,处理完之后程序会继续运行,如果抛出的异常未被捕获,将导致程序终止。那么就需要进行异常的捕获--------try.....catch。原创 2022-12-01 08:41:39 · 463 阅读 · 0 评论 -
C++泛型编程:可变参数模板
一个可变参数模板通俗来讲就是:一个接受可变数目参数的模板函数或模板类在c++11之前,类模板和函数模板只能含有固定数量的模板参数,c++11增加了可变模板参数特性:允许模板定义中包含0到任意个模板参数。声明可变参数模板时,需要在typename或class后面加上省略号"..."。就像我上面指出的源码那样在了解其之前我们要先知道什么是参数包?可变数目的参数被称为参数包。存在两种参数包:表示零个或多个模板参数表示零个或多个函数参数怎么好理解可变参数模板呢?原创 2022-10-13 14:00:38 · 2229 阅读 · 5 评论 -
右值引用延长其生存期的问题
类类型的右值的确是临时变量,但是类类型的临时变量是可以调用成员函数的,包括(operator=)赋值运算符重载函数,这体现在代码上就是:类类型的临时变量可以赋值。还是上面那个结论右值修改的问题,我如果把fun函数返回值改成内置类型不管你加不加const,你都不能去修改,因为你内置类型返回的将亡值是个纯右值,是不能被修改的,纯右值自带常性。const引用的话你所引用的肯定改不了了,crv=100啊这些都肯定是错的,但是右值引用那就可以改了,改的就是里面那么临时的将亡值tmp。原创 2022-10-06 20:17:56 · 2018 阅读 · 4 评论 -
(已知中后序、先中序遍历)恢复二叉树
我们以下图的二叉树作为示例来演示二叉树的恢复根据前序和中序 或者后序和中序 才能复原二叉树,要恢复二叉树必须知道中序序列,只是知道前序和后序,不能恢复二叉树,因为不知道中序序列无法获知根节点的左右子树位置。首先创建结点和树,以下代码不做过多赘述,如果不清楚可以转入。原创 2022-09-29 21:24:26 · 775 阅读 · 0 评论 -
C++从0吃透string类
本篇讲解C++中string类的创建和使用,分功能举例(建议跟着文章手撸代码,方便记忆理解)欢迎订阅专栏。原创 2022-08-25 09:52:25 · 543 阅读 · 0 评论 -
C++类中默认的八个函数
在C++类中默认的缺省函数一共有8个,很多人知道前6个,后两个是C++11新添加的。原创 2022-08-19 17:07:43 · 891 阅读 · 0 评论 -
深入C++纯虚函数和抽象类
纯虚函数是指被标明为不具体实现的虚拟成员函数。当我们定义一个基类时,当遇到无法定义基类中虚函数的具体实现时,且其实现依赖于不同的派生类。定义纯虚函数的一般格式为virtual返回类型函数名(参数表)=0;eg如果某一种行为必须具体到一个对象时才知道这种行为是什么,那么就把它写为纯虚函数。如基类定影动物的叫声,但是针对动物这个类我们无法实现叫声这个函数,需要借助不同的对象即派生类来重写不同的叫声函数,那么我们就可以将基类中叫声函数设置为纯虚函数。拥有纯虚函数的类称为抽象类。......原创 2022-08-05 10:28:38 · 674 阅读 · 1 评论 -
深入C++虚函数表
多态性是面向程序设计的关键技术之一。若程序设计语言不支持多态性,不能称为面向对象的语言。多态性是考虑在不同层次的类中,以及在同一类中,同名的成员的关系问题。说白了就是指在父类中定义的属性和方法被子类继承之后,可以具有不同的数据类型或表现出不同的行为,这使得同一个属性或方法在父类及其各个子类中具有不同的含义。多态的分类多态又分为编译时的多态性(静态的多态性),函数重载,运算符的重载都属于编译时的多态以类的虚成员函数为基础的运行时的多态virtual返回类型函数名(参数表)............原创 2022-08-02 10:19:08 · 611 阅读 · 4 评论 -
C++之static
设计静态数据成员目的是信息共享,和信息交流类的静态数据成员为所有类对象所共享,不属于某个具体的实例类的静态数据成员必须在类外定义,定义时不添加static关键字,不能在构造函数的初始化列表中创建类的静态数据成员类型是int,short,char,longlong,并且是const,可以在类中直接初始化也可以在类外初始化在类的成员函数中使用静态数据成员,静态数据成员之前没有this当类的静态数据成员为公有时,可以在外部函数使用类名静态数据成员名或者对象.静态数据成员名。......原创 2022-07-31 12:00:00 · 3267 阅读 · 1 评论 -
C++有关继承
C++通过类派生的机制来支持继承。被继承的类称为基类或超类,新产生的类称为派生类或者子类。基类和派生类的集合被称作类继承层次结构。class派生类名访问限定符基类名{private成员表1;//派生类增加或替代的私有成员public成员表2;//派生类增加或替代的公有成员protected成员表3;//派生类增加或替代的保护成员};注意派生反映了事物之间的联系,事物的共性与个性之间的关系。派生与独立设计若干相关的类,前者工作量少,重复的部分可从基类继承,不需要单独编程。...............原创 2022-07-28 01:10:27 · 407 阅读 · 2 评论 -
C++之内存分布(对于堆栈空间的剖析)
当我们程序运行前可以分为两个区域分别是:当程序运行开始:堆区: 由程序员分配释放,若程序员不释放,程序结束时由操作系统回收 在C++中主要利用new在堆区开辟内存 eg1:由下面这一段代码来说明每个变量存储的地方:eg2图示: 首先,我们举一个例子:这条短短的一句话就包含了堆与栈,看到 new,我们首先就应该想到,我们分配了一块堆内存,那么指针 p 呢?他分配的是一块栈内存,所以这句话的意思就是:在栈内存中存放了一个指向一块堆内存的指针 p。在程序会先确定在堆中分配内原创 2022-07-19 00:05:59 · 2363 阅读 · 11 评论 -
MyString类模拟实现(写实拷贝,柔性数组)
能出现在赋值号左边的表达式称为“左值”,不能出现在赋值号左边的表达式称为“右值”。一般来说,左值是可以取地址的,右值则不可以。非 const 的变量都是左值。函数调用的返回值若不是引用,则该函数调用就是右值。一般的“引用”都是引用变量的,而变量是左值,因此它们都是“左值引用”。C++11 新增了一种引用,可以引用右值,因而称为“右值引用”。无名的临时变量不能出现在赋值号左边,因而是右值。右值引......原创 2022-06-12 18:22:50 · 559 阅读 · 7 评论 -
用重载说明白++i和i++
在学习C++过程中我们会发现,对于迭代器和其他模板对象使用前缀形式 (++i) 的自增, 自减运算符,理由是 前置自增 (++i) 通常要比后置自增 (i++) 效率更高。在《C专家编程》中也讲到:++a表示取a的地址,增加它的内容,然后把值放在寄存器中;a++表示取a的地址,把它的值装入寄存器,然后增加内存中的a的值;例如:对于int类型变量,在进行前置++的时候,是会将i进行加1,然后返回i的引用。而i++是先创建一个i的副本,然后在对i进行加1,最后返回i的副本的值对于效率不同的问原创 2022-05-30 21:34:59 · 4504 阅读 · 7 评论 -
C++(深拷贝浅拷贝)详解
文章开始给大家瞧瞧昨晚拍的大黄嘿嘿~捞捞之前的总结:十万字带你学习C++(细节拉满)什么是浅拷贝?在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制,按位拷贝。即浅拷贝:简单的赋值拷贝操作(这个是系统默认提供的)如下所示:我没有写显式写出拷贝构造函数和拷贝赋值函数,编译器会给我们默认提供拷贝构造和拷贝赋值函数当我们给出上述代码显示的浅拷贝构造时:INT(const INT &my):value...原创 2022-05-25 14:20:55 · 1290 阅读 · 7 评论 -
十万字带你学习C++(细节拉满)
为了帮助所有学习C++的朋友能够系统的了解C++,我总结了这篇《C++从入门到精通》,希望能够帮助大家共同学习,如有错误还请及时指正!!关注我后续持续更新C++内容总结!文章分为三个部分: C++基础入门阶段 C++面向对象 C++继承与派生 C++基础入门阶段 :1.C++统一初始化初始化列表:{ } 在C++中我们可以使用{ }初始化一切数据类型#include<iostream>using namespace std;.......原创 2022-05-01 17:00:00 · 3326 阅读 · 12 评论