
必须掌握的C++基础
文章平均质量分 82
C++知识
英雄哪里出来_
这里是一个技术博客。 C/C++,数据结构,计算机网络,操作系统,数据库,C++造轮子系列,Leedcode算法题的知识总结可以到主页左侧的“分类专栏”查阅。
感谢你的关注。
展开
-
C++锁的使用
线程之间的锁有:互斥锁、条件锁、递归锁、读写锁、自旋锁。其中自旋锁比较特殊,它是一种busy-waiting锁。如果T1正在使用自旋锁,而T2也去申请这个自旋锁,此时T2不但得不到这个自旋锁,而且与互斥锁相反的是,此时运行T2的处理器core2会一直不断地循环检查锁是否可用(自旋锁请求),直到获取到这个自旋锁为止。除自旋锁外,其他的锁都是sleep-waiting锁。原创 2024-09-23 11:19:11 · 1292 阅读 · 0 评论 -
C++单例模式
单例模式设计模式是 被反复使用 多数人知晓 经过分类的、代码设计经验的总结单例模式:一个类只能创建一个对象 即单例模式,该模式可以保证系统中该类只有一个实例单例模式分为饿汉模式和懒汉模式。原创 2024-09-23 11:05:51 · 514 阅读 · 0 评论 -
C++11(下)
std::thread 是 C++11 引入的标准库类,用于创建和管理线程。它使得多线程编程变得更加方便和安全。原创 2024-09-23 10:48:14 · 900 阅读 · 0 评论 -
C++11(上)
auto 关键字在 C++11 中引入,用于让编译器自动推导变量的类型。基本用法:auto 可以用于变量的声明,让编译器根据初始化表达式来推导变量的类型。原创 2024-09-22 21:28:10 · 568 阅读 · 0 评论 -
C++智能指针详解
看下面的例子:若p1处new抛异常,则相当于p1的new没有成功,则什么都不用做若p2处new抛异常,则相当于p2的new没有成功,而p1的new成功了,所以需要释放p1,然后再重新抛出若div处抛异常,则将p1与p2都释放,再将其重新抛出可以看出处理起来非常麻烦,存在内存泄漏的问题(只进行new,但没有delete)第二个new抛异常要释放第一个new,div抛异常要释放前两个new若再添加一个new,则又会存在new抛异常的问题,还需添加 try catch。原创 2024-09-22 17:30:30 · 1062 阅读 · 0 评论 -
C++继承(下)
如果A变大,就不亏了,指向的空间忽略不计,会创建很多对象,每个对象都指向该空间,由大家共同分担,所以消耗可以忽略不计。感觉变大是因为A太小了,解决数据冗余和二义性,会增加了两个指针,只节省了一个A,即4个字节,相当于多消耗了4个字节。若两个类干的事是一样的,就把他们两个放在一起,若这两个类毫不相关,就不要合在一起。组合是一种has-a的关系,假设B组合了A,每个B对象中都有一个A对象。使用虚继承是为了解决数据冗余的问题,但是调用内存发现整体变大了。为了解决菱形继承的二义性和数据冗余的问题,提出了虚继承。原创 2024-02-01 11:13:20 · 360 阅读 · 0 评论 -
C++继承(上)
但是实际使用时报错,因为子类的operator= 与父类的operator= 形成隐藏,会优先使用子类的operator=,所以会无限循环使用子类的operator= 从而报错。但是实际上依旧是不合理的,若再传入年龄、电话、住址等信息,由于这些信息都是相同的,只有名字不同,相当于把名字多存了,就会造成数据冗余,本质为空间浪费。因为父类和子类在不同的作用域,所以可以分别在父子类中创建相同的成员变量,但是这样只会访问子类的成员变量。构造时,先构造父类,在构造子类,所以析构时,要先析构子类,在析构父类。原创 2024-02-01 11:05:38 · 806 阅读 · 0 评论 -
C++模板(下)
缺陷模板会导致代码膨胀问题,也会导致编译时间变长模板会进行实例化,所以运行时间变长,因为是一个模板,若传过来int 、char、double 类型都要实现,所以代码会膨胀出现模板编译错误时,错误信息非常凌乱,不易定位错误通常为一报错就一大堆错误,一般只需要找到第一个错误并解决它,就可以了。原创 2024-02-01 09:20:06 · 323 阅读 · 0 评论 -
C++模板(上)
class 类模板名// 类内成员定义public:_top = 0;size_t top;int main()//想要S1存储int//想要S2存储doublereturn 0;类模板只能显示实例化,这样就可以达到s1存储int,S2存储doublepublic:, _size(0){}~Vector();//析构函数类中的声明private:T* _pData;原创 2024-02-01 09:07:26 · 1009 阅读 · 0 评论 -
C++内存管理
delete[]p1;return 0;申请2个A类型的空间,调用2次构造函数释放空间,并调用2次析构函数虽然写入了malloc在堆开辟10个A类型空间,free释放空间,但是没有调用构造和析构函数2.总结在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与free不会。原创 2024-01-31 17:26:45 · 827 阅读 · 0 评论 -
日期类的实现
【代码】日期类的实现。原创 2024-01-31 16:09:06 · 352 阅读 · 0 评论 -
类和对象(三)
是它所有成员变量定义的位置。因为通过构造生成一个类型为A的临时变量,而临时变量具有常性,ret为临时变量的别名, 将临时变量传过去,由const A类型到A类型会造成权限放大,所以要加const修饰ret,说明临时变量的存在。1.可以在类中的成员变量声明处加入缺省值,若该变量在初始化列表中被定义,则该变量为被定义后的值,若在初始化列表中没有被定义,则该变量输出缺省值.不可以,缺省值是在初始化列表处进行初始化,而初始化列表是初始化非静态成员(属于对象的成员),而static修饰的成员属于共有的。原创 2024-01-31 16:00:06 · 968 阅读 · 0 评论 -
类与对象(二)
传入类中,由于隐藏的this指针的存在,取第一个参数d1的地址传过去被this指针接收,_year等价于d1._year。将&a传过去由this指针接收, a指针类型为 const date* ,this指针类型为 date* ,将const date * 传给date * 属于权限的放大。类中共有6个默认成员函数,即自己不实现,编译器会帮助我们实现出来。无参的构造函数和全缺省的构造函数都被称为默认构造函数,并且默认构造函数只能有一个对于无参的,两者都可以使用,就没必要共同存在默认构造函数:(不用传参数)原创 2024-01-29 14:47:41 · 732 阅读 · 0 评论 -
内存的分区
1.我们的内存一般分为四个区域提供使用且每个区域存放的数据不同,使用效果也不同它们分别是:堆区、栈区、全局区(静态区)、代码区。2.而对于一个程序的编译而言编译程序占用的内存分为以下五个部分 :堆区、栈区、全局区(静态区)、文字常量区、代码区。原创 2024-01-29 11:24:05 · 1439 阅读 · 0 评论 -
类与对象(一)
C++中通过引入this指针解决该问题,即:C++编译器给每个“非静态的成员函数“增加了一个隐藏的指针参数,让该指针指向当前对象(函数运行时调用该函数的对象),在函数体中所有“成员变量”的操作,都是通过该指针去访问。Date类中有 Init 与 Print 两个成员函数,函数体中没有关于不同对象的区分,那当d1调用 Init 函数时,该函数是如何知道应该设置d1对象,而不是设置d2对象呢?class为定义类的关键字,ClassName为类的名字,{}中为类的主体,注意类定义结束时后面分号不能省略。原创 2024-01-28 11:30:26 · 850 阅读 · 1 评论 -
C++入门必会(C++必会)
/ 命名空间中可以定义变量/函数/类型int a = 0;int b = 1;int main()// 编译报错:error C2065: “a”: 未声明的标识符return 0;//2. 命名空间可以嵌套int a;int b;int c;int d;//3. 同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中。// ps:一个工程中的test.h和上面test.cpp中两个N1会被合并成一个// test.h。原创 2023-10-25 20:42:24 · 189 阅读 · 1 评论