C++初阶
文章平均质量分 92
Murphy_lx
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++ thread类
C++ thread类 作用 创建一个不关联任何线程的线程对象(空线程对象) 注意事项 创建的对象不执行任何函数 返回 不能对其调用 或 主要用于后续的移动赋值操作 2. 初始化构造函数 (2) 函数声明 参数说明 : 可调用对象(函数、函数指针、成员函数指针、函数对象、lambda表达式等) : 传递给可调用对象的参数包 作用 创建新线程并立即开始执行指定的可调用对象 Lambda 表达式 成员函数 函数对象(Functor) 参数传递细节 值传递(默认) 引用传递(使用 std::原创 2025-11-05 15:03:19 · 742 阅读 · 0 评论 -
C++多态的原理
答案是:B。讲解:这里这道题目其实就是单纯为了考试存在的,如果我们实际工作中写出这种代码,被骂司马都算好的了。所以大家千万不要学习这种纱布代码。原创 2025-07-31 17:30:37 · 998 阅读 · 0 评论 -
C++ 多态
特性静态多态动态多态实现方式函数重载、模板虚函数、继承绑定时机编译期运行期性能无额外开销有 vtable 查找开销灵活性较低高典型应用运算符重载、泛型编程框架扩展、接口抽象。原创 2025-07-31 17:24:38 · 612 阅读 · 0 评论 -
C++继承
想象“交通工具”是一个基类(Base Class),它具有通用属性(如颜色、重量)和行为(如启动、停止)。从“交通工具”可以派生出更具体的类,如“汽车”(Car)、“自行车”(Bicycle)、“轮船”(Ship)。这些派生类(Derived Class)继承了交通工具的所有通用特性,同时又可以添加自己特有的属性(如汽车的“排量”、自行车的“齿轮数”)和行为(如汽车的“鸣笛”、轮船的“鸣笛”)。原创 2025-07-29 12:51:00 · 1284 阅读 · 0 评论 -
C++模板详解:非类型模板参数、特化与分离编译
| // 实现代码| }链接错误。原创 2025-07-28 10:31:17 · 919 阅读 · 0 评论 -
C++ array 容器详解
是 C++ 中固定大小数组的现代替代方案,在保持 C 风格数组性能的同时,提供了类型安全、边界检查和 STL 兼容性等优势,应成为固定大小容器的首选。它结合了 C 风格数组的性能优势和 STL 容器的安全性与接口。是 C++11 引入的固定大小数组容器,位于。原创 2025-07-28 10:27:23 · 620 阅读 · 0 评论 -
C++中的反向迭代器
为啥反向迭代器的讲解要单独拎出来讲,没有在讲各个容器的时候顺手讲了呢?主要是因为c++中的反向迭代器和正向迭代器的实现不太一样。如果按照源码那样设计,代码就得写成这样:(变动的地方我都在旁边注释出来了。同理在vector容器中也是一样:也就是我说的使用容器适配器思想写一个“万能的”反向迭代器。来,我们按照我们刚刚的想法把代码写出来。来,我们按照刚刚的思想重新写一遍代码。test.cpp//测试代码。test.cpp//测试代码。test.cpp//这个没变。它思想不复杂,主要是巧。来,我们看重点部分哈。原创 2025-07-25 17:30:37 · 572 阅读 · 0 评论 -
C++中的deque
Deque 是 “”(双端队列)的缩写。你可以把它想象成一个可以在两端(头部和尾部)高效地进行添加或删除操作的线性数据结构。关键特性:这是 deque 最显著的特点。你可以在队列的开头(front)或结尾(back)快速地插入(push_frontpush_back)或删除(pop_frontpop_back)元素。元素在 deque 中是按顺序存储的,每个元素都有一个确定的位置(索引)。你可以像数组或 vector 一样,通过下标operator[]或at()来随机访问。原创 2025-07-25 14:53:33 · 924 阅读 · 0 评论 -
C++中的stack和queue
Stack(栈)后进先出(LIFO):最后插入的元素最先被移除。类比:一摞盘子(只能从顶部取放)。push(入栈)、pop(出栈)、top(访问栈顶)。Queue(队列)先进先出(FIFO):最先插入的元素最先被移除。类比:排队购票(队尾进,队头出)。push(入队)、pop(出队)、frontback(访问队头/队尾)。特性stackqueue数据顺序LIFO(后进先出)FIFO(先进先出)核心接口push()pop()top()push()pop()front()底层依赖。原创 2025-07-24 14:19:24 · 893 阅读 · 0 评论 -
C++中的list(2)简单复现list中的关键逻辑
这一节的主要内容就是:简单复现list中的关键逻辑。同样的,我们这一节也是先粗略的看一眼源码,结合源码,边理解边复现。源码我已经上传到gitee,网址如下:Murphy/博客存档,我们主要看的就是其中的其次就是这一节是有难度的,但是难度很高吗?也不是很高,我尽量捋顺了给大家说清楚。这一节最主要的几个知识点就是:模板、封装、以及数据结构的逻辑。这一部分大家可看可不看,这是我自己梳理的一个逻辑过程,帮助我自己理解list的。大家感兴趣可以看一下,当然也可以直接跳过这部分。首先我们知道list容器是一个带头双向循原创 2025-07-22 15:57:02 · 1530 阅读 · 0 评论 -
C++中的list(1)
std::list是一个强大的双向链表容器。它在序列中间频繁插入和删除操作上效率无敌(O(1)),并且提供了卓越的迭代器稳定性。它还支持高效的链表特有操作如splicemergesort。但是,它不擅长随机访问(O(n))内存开销相对较大,并且缓存不友好。作为后端工程师,选择它时要非常明确:你的场景是否极度依赖中间的高效插入删除?是否需要超强的迭代器稳定性?如果答案是肯定的,并且可以接受随机访问慢和内存稍大的代价,那么list就是你的神兵利器。否则,vector或deque通常是更通用、性能更均衡的选择。原创 2025-07-19 13:53:35 · 1163 阅读 · 0 评论 -
C++中的vector(2)
那么这次我们复现vector之前会选择性的看一些源码,这份源码并不是最新的,不过也够了。这里我直接把源码贴出来给大家,大家可以先行复制一份到本地电脑上看。原创 2025-07-19 11:06:40 · 1075 阅读 · 0 评论 -
C++中的vector(1)
注:因为容器的接口都具有相似性,如果下面没有介绍到的,大家可以通过文章开头我给大家的网站去学习,结合对string的理解,学习别的容器很快的。此外还有一些接口的实用性不大,也不会涉及。接口特点安全性适用场景operator[]无边界检查,速度快低(越界导致未定义行为)确定索引有效时at有边界检查,抛异常高(异常可捕获)不确定索引是否有效时front访问首元素依赖非空检查需要首元素且已确保非空时back访问尾元素依赖非空检查需要尾元素且已确保非空时data返回原始指针,兼容C接口。原创 2025-07-16 15:16:23 · 1286 阅读 · 0 评论 -
对C++中string类的补充
COW 机制依赖引用计数来判断数据当前是否被共享。没有引用计数,COW 无法高效地确定何时需要执行实际的拷贝。引用计数本身解决了资源释放和共享所有权的问题。COW 则是在此基础上,为了避免不必要的深拷贝(尤其是在拷贝后不修改或只修改一部分的场景)而引入的一种惰性拷贝优化策略。它利用引用计数提供的信息来决定拷贝操作是否可以延迟到真正需要修改数据时才执行。在 COW 的实现中:拷贝操作:增加引用计数,共享数据。析构操作:减少引用计数,计数为 0 时释放数据。原创 2025-07-13 15:37:00 · 330 阅读 · 0 评论 -
较为深入的了解c++中的string类(2)
这一章我们主要复现了一些重要的操作函数,希望可以帮助到大家更好的理解string类。原创 2025-07-11 17:55:59 · 810 阅读 · 0 评论 -
较为深入的了解c++中的string类(1)
除了汉字还有其他的一些语言, 诸如日语昂, 韩语昂, 都需要用到不同的编码, (编码这里就不在细说了), 那么为了应对不同的编码规则, 就要有多个类似的string类, 因为这些string类只是参数类型不同(或者说编码规则不同), 其他的逻辑都是相同的, 写多份很明显就是多余了嘛, 所以c++就写了一个类模板。ASCII 编码特点就是单字节编码, 也就是说, 一个字节就可以代表一个单元信息(一个字母, 一个数字, 一个符号), 一个字节就是8个比特, 对应就是。原创 2025-06-03 18:30:52 · 564 阅读 · 0 评论 -
C++中的string(1)简单介绍string中的接口用法以及注意事项
简单介绍string中的接口用法以及注意事项原创 2025-05-22 20:11:26 · 1478 阅读 · 0 评论 -
C++模板
如果你函数声明和定义分离,就要这样写, 否则不用此外, 类模板里面的成员函数声明和定义不能写在两个文件, 也就是说, 你不能把函数声明写在头文件, 然后cpp文件再去实现. 这个后面再说.四、模板参数。原创 2025-05-13 18:24:31 · 1243 阅读 · 0 评论 -
C++内存管理
c++其实可以说是c语言的一个扩展版本, 所以在内存管理和内存区域划分方面两者是很相似的. 今天来给大家讲一下c++的内存管理.这是程序内存区域划分的大概的样子 :newdeletemallocfreenewdeletestatic"hello"const那为什么要这样划分内存区域呢?原创 2025-05-10 14:35:39 · 993 阅读 · 0 评论 -
类和对象(下)
当实例化一个类的对象时,编译器会为对象的成员变量分配内存空间,从这个角度来说,可以认为成员变量在对象实例化时被 “定义” 了。在这行代码执行时,编译器为obj对象的num和value成员变量分配了内存空间。所以初始化列表第二个解决的问题就是, 这个类类型变量没有默认构造函数, 我们得在初始化列表用那个传参的构造函数进行类类型变量的初始化.原创 2025-05-07 18:17:24 · 1310 阅读 · 0 评论 -
类和对象(拷贝构造和运算符重载)下
在成员函数的参数列表之后添加const关键字,就能将其声明为const成员函数。public:// 返回类型 函数名(参数列表) const// 函数体。原创 2025-05-01 17:38:29 · 901 阅读 · 0 评论 -
类和对象 (拷贝构造函数和运算符重载)上
内置运算符只能处理内置类型,而对于自定义类型,你可以通过运算符重载来定义适合它们的运算规则。在 C++ 中,除了可以在类内定义运算符重载函数,也能在类外进行定义。类外定义运算符重载函数通常有两种情况,一种是普通的非成员函数,另一种是使用友元函数。下面为你详细介绍这两种方式。原创 2025-04-29 17:06:16 · 874 阅读 · 0 评论 -
类和对象(构造函数和析构函数)
如果类包含其他类类型的成员,默认构造函数会调用这些成员对象的默认构造函数来初始化它们。public:std::cout << "AnotherClass 默认构造函数被调用" << std::endl;在这个例子中,当创建MyClass对象obj时,默认构造函数会调用的默认构造函数来初始化member成员。编译器生成的默认构造函数在初始化类时表现较为 “消极”,对于基本数据类型成员不做初始化,对于类类型成员则调用其默认构造函数进行初始化。原创 2025-04-24 17:51:33 · 1275 阅读 · 0 评论 -
C++类和对象(上)
public成员提供了类的外部接口,方便外部代码与类进行交互。private成员用于封装类的内部实现细节,保证数据的安全性。protected成员在继承体系中发挥作用,允许派生类访问基类的特定成员。不过在现阶段对于我们来说private和protected是没啥区别的,后面讲继承的时候protected和private的区别才会体现出来。成员变量的类型和数量。内存对齐规则。静态成员变量不占用类对象的内存空间。成员函数不占用类对象的内存空间。虚函数会引入虚函数表指针,增加类的大小。原创 2025-04-23 14:49:36 · 942 阅读 · 0 评论 -
C++入门语法
宏定义是在预处理阶段由预处理器处理的,它利用#define指令把一个标识符定义为一个字符串。在编译代码之前,预处理器会将代码里所有该标识符替换成对应的字符串。处理阶段不同:宏定义在预处理阶段处理,只是简单的文本替换;内联函数在编译阶段处理,由编译器决定是否内联。类型检查:宏定义没有类型检查,内联函数有类型检查,更加安全。代码膨胀:宏定义容易导致代码膨胀,内联函数由编译器控制,能避免不必要的代码膨胀。调试难度:宏定义调试比较困难,因为预处理器替换后的代码可能和原始代码差异较大;原创 2025-04-21 14:53:49 · 1412 阅读 · 0 评论
分享