
C++程序设计
文章平均质量分 84
Hungry_11
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
C++类型转化
static_cast用于非多态类型的转换(静态转换),编译器隐式执行的任何类型转换都可用static_cast,但它不能用于两个不相关的类型进行转换。reinterpret_cast操作符通常为操作数的位模式提供较低层次的重新解释,用于将一种类型转换为另一种不同的类型。因此C++提出了自己的类型转化风格,注意因为C++要兼容C语言,所以C++中还可以使用C语言的转化风格。转换的可视性比较差,所有的转换形式都是以一种相同形式书写,难以跟踪错误的转换。转换为子类对象的指针或引用(动态转换)。原创 2025-03-30 19:43:27 · 494 阅读 · 0 评论 -
C++智能指针
具体来说,RAll的核心是:对象构造时获取资源,对象析构的时候释放资源,又由于对象析构会在退出函数栈帧时自动释放,所以我们不需要显式的释放资源。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。前两种智能指针实际上没有很好的解决智能指针之间的拷贝问题,于是C++11又设计了另一种可以支持拷贝且不会造成指针悬空的智能指针,即。auto_ptr的实现原理:管理权转移的思想,下面简化模拟实现了一份bit::auto_ptr来了解它的原理。原创 2025-03-30 13:20:04 · 694 阅读 · 0 评论 -
C++异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。// 服务器开发中通常使用的异常继承体系public:, _id(id){}protected:int _id;public:{}原创 2025-03-30 11:54:39 · 359 阅读 · 0 评论 -
C++11新特性
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址。原创 2025-03-29 18:36:25 · 1324 阅读 · 0 评论 -
哈希表与unordered_map,unordered_set
即使多个元素通过哈希函数得到的地址是一样的,也不会显著影响哈希表的性能。此外,拉链法下的负载因子是可以超过1的,因此拉链法下的哈希表可以灵活的应对动态数据集的增长,不需要频繁的调整哈希表的大小。哈希表最显著的特点就是查找数据的效率非常的高,平均查找的时间复杂度为O(1)。造成哈希冲突的主要原因是,哈希表的大小是有限的,而输入的数据可能会非常多,因此不可能避免出现哈希冲突。需要直到的是,开散列的负载因子也是使用元素个数计算的,也就是说,数组中并没有占满,有的位置一直是空,那么也会面临扩容的情况。原创 2025-02-23 16:36:51 · 701 阅读 · 0 评论 -
C++模拟实现map和set
map和set的底层都是红黑树,而我们使用的红黑树之前模拟实现是使用的key - value模型。但是只有map是key - value模型,而set是一组key的集合,但不存储value。由于key不能重复,所以,在set中,没有重复的key必须是唯一的。set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。但是从源码中可以看到,set虽然只存储key,但是他仍然是使用的key - value模型。底层实际存放的是由<value, value>构成的键值对。原创 2025-02-23 16:35:53 · 996 阅读 · 0 评论 -
C++红黑树
enum Color//节点的颜色RED,BlackColor _col;RBTreeNodeenum Color //节点的颜色 {Color _col;_kv(kv);_col(RED);} };enum Color //节点的颜色 {Color _col;_kv(kv);_col(RED);} };_kv(kv);_col(RED);原创 2025-02-21 17:10:29 · 827 阅读 · 0 评论 -
C++实现AVL树
/比较两个结点的大小使用first进行比较int _bf;//平衡因子,Balance factor, _kv(kv), _bf(0){}原创 2025-02-21 17:09:45 · 875 阅读 · 0 评论 -
二叉搜索树
的值进行互换,然后删除左子树的最大结点或者右子树的最小结点。最复杂的是第四种情况,当左右都不为空的时候可以选择与。二叉搜索树的管理仅需要一个根节点的指针就好。其中第一种情况可以与第二或者第三种情况合并。其中最需要注意的是删除操作,原创 2025-02-20 16:08:08 · 521 阅读 · 0 评论 -
C++多态
多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了Person。Person对象买票全价,Student对象买票半价。只有在继承中多态才存在。public:cout << "全价" << endl;public:/*注意:在重写基类虚函数时,派生类的虚函数在不加virtual关键字时,虽然也可以构成重写(因为继承后基类的虚函数被继承下来了在派生类依旧保持虚函数属性),但是该种写法不是很规范,不建议这样使用*/原创 2025-02-17 22:46:59 · 1105 阅读 · 0 评论 -
C++继承
Person是父类,也称作基类。Student是子类,也称作派生类。很多人说C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是C++的缺陷之一,很多后来的OO语言都没有多继承,如Java。继承和组合public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象。组合是一种has-a的关系。原创 2024-09-24 15:39:14 · 1348 阅读 · 0 评论 -
C++模板进阶
因为编译的时候进行的语法检查,Add函数在头文件有声明,语法就没有错误,只要链接的时候才会去符号表中寻找函数。但是在。原创 2024-09-24 15:38:52 · 917 阅读 · 0 评论 -
C++模拟实现priority_queue(仿函数)
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)关于仿函数的使用,不仅仅局限于上面代码的比较,还可以进行类的比较,不如日期类或者日期类的指针。看手册的描述可以发现,我们需要传我们需要的比较逻辑,sort会根据bool类型的返回确定仿函数的两个参数哪一个排在前面。通过上述代码,即使优先级队列插入的是日期类的指针,同样可以按照我们需要的大小输出。,我们可以根据我们的需要改变比较逻辑。原创 2024-09-11 17:24:37 · 503 阅读 · 0 评论 -
C++模拟实现stack和queue(容器适配器)
适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另外一个接口。简单理解,将模板参数给成容器,就是容器适配器,写成参数的容器的各种接口,均满足需要。原创 2024-09-11 12:35:20 · 328 阅读 · 0 评论 -
C++模拟实现list与operator*与operator->
可以发现上述代码中为了解决const修饰的链表仍然可以通过迭代器修改结点的值的问题,重新写了一个类,但是这个类中只要解引用和->访问被const修饰了。其他成员函数都是一样的。于是可以通过模板解决这个冗余的问题。讲解引用和->的重载返回值改用模板参数。然后通过list中的两个宏去定义二者。这样就有了两个类,且功能和上面的代码一样。list的实现最主要的点就是迭代器的实现,不能在使用原生指针,因为链表的结点并不是连续的。原创 2024-09-06 13:52:27 · 529 阅读 · 0 评论 -
C++模拟实现vector与typename前缀确定类型
模拟实现vector只是实现了一些基础功能,复杂一些操作可能会存在bug。一些相关知识点在注释标注。原创 2024-08-28 10:05:22 · 243 阅读 · 0 评论 -
模拟实现string
模拟实现string只是仿造库里的功能模拟实现,并不和库中代码一样。需要知道的是,string在不同的编译器下,string的实现也是有差异的。原创 2024-08-28 10:04:54 · 419 阅读 · 0 评论 -
C++string
在cplusplus这个网站上的介绍可以知道,string是C++标准库中的一个类,*而且可以发现string其实是一个宏,是其中是类名,宏替换为string。可以发现也是一个类模板实例化为char类型的一个 类 类型。所以可以理解为string就是一个存储字符串的一个类。之所以定义为宏和编码方式有关。在 C语言 中,字符串是以\0结尾的一些字符的集合,C++面向对象编程,于是 C++ 中就引入了string类,它可以看做是一个管理字符串的数据结构。原创 2024-08-22 12:43:10 · 941 阅读 · 0 评论 -
C++模板
所以也不是调用的最开始的模板代码,他们调用的是编译时编译器通过模板生成的代码。对于模板来说,他所在的位置,如果是全局的,那么实例化出来的模板函数就是全局的,如果是成员函数,那么实例化出来的函数就是成员函数。对比typedef可以发现,如果要想实现上述的定义两个不同类型的栈,宏的方式就必须定义两个宏,且必须定义两个结构体。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。用不同类型的参数使用函数模板时,称为函数模板的实例化。函数模板的参数可以不止一个,原创 2024-08-21 13:22:49 · 1244 阅读 · 0 评论 -
C++内存管理
除了开空间还会调用构造函数和析构函数。在申请自定义类型的空间时,原创 2024-08-21 13:22:22 · 1065 阅读 · 0 评论 -
友元 / 内部类 / 匿名对象
的普通函数,但有权访问类的所有私有(private)成员和保护(protected)成员。尽管友元函数的原型有在类的定义中出现过,但是。原创 2024-08-20 13:15:21 · 1034 阅读 · 0 评论 -
初始化列表 / 隐式转换 / 静态
初始化列表给了初始值,如果没有初始值,在C++11中的打了补丁,给了缺省值,即在类声明的时候给的值,其实就是初始化时候要给的值,如果没有缺省值,那初始化就给默认值。原创 2024-08-19 09:16:28 · 1039 阅读 · 0 评论 -
this指针 \ 默认成员函数 \ 重载 \ const
分析一个类型成员和初始化需求,需要我们写构造函数我们就自己写,不需要 ,就用编译器生成的。绝大多数场景下我们要自己写构造函数。并不是编译器生成的构造函数才叫默认构造函数,原创 2024-08-19 09:15:56 · 880 阅读 · 0 评论 -
C++类和对象认识
定义一个类需要使用关键字class,然后指定类的名称,并类的主体是包含在一对花括号中,主体包含类的成员变量和成员函数。定义一个类,本质上是定义一个数据类型的蓝图,它定义了类的对象包括了什么,以及可以在这个对象上执行哪些操作。// 类体:由成员函数和成员变量组成 };// 一定要注意后面的分号像上面写的栈的代码,成员函数的参数名和成员变量的名称可能相同,所以,对类中的成员变量进行一定规则的命名,便可以很好的区分class Dateint _year;// 或者class Date。原创 2024-08-18 13:49:57 · 785 阅读 · 0 评论 -
内联函数与auto关键字与nullptr
如果两个C文件都包含了此头文件,就会报链接错误。我们包含头文件,然后预编译的时候展开,展开后就相当于在此C文件定义了一个函数,两个C定义同一个函数,就会报错。因为在彼此。原创 2024-08-18 13:49:26 · 622 阅读 · 0 评论 -
C++引用
引用被称为变量的别名,它不能脱离被引用对象独立存在,这是在高级语言层面的概念和理解,并未揭示引用的实现方式。常见错误说法是“引用“自身不是一个变量,甚至编译器可以不为引用分配空间。引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量共用同一块内存空间。实际上,引用本身是一个变量,只不过这个变量的定义和使用与普通变量有显著的不同。但是引用自身占用内存,引用也是一种变量。在C语言中我们要交换两个数是这样的。如果用引用作为参数的话就是这样的。原创 2024-03-21 17:16:21 · 264 阅读 · 0 评论 -
C++基本认识
实际项目通常是由多个头文件和多个源文件构成,而通过C语言阶段学习的编译链接,我们可以知道,【当前a.cpp中调用了b.cpp中定义的Add函数时】,编译后链接前,a.o的目标文件中没有Add的函数地址,因为Add是在b.cpp中定义的,所以Add的地址在b.o中。所以链接阶段就是专门处理这种问题,链接器看到a.o调用Add,但是没有Add的地址,就会到b.o的符号表中找Add的地址,然后链接到一起。而C++是通过函数修饰规则来区分,只要参数不同,修饰出来的名字就不一样,就支持了重载。这样写是不对的,必须。原创 2024-03-20 18:51:38 · 467 阅读 · 0 评论 -
C++认识及域的概念
命名空间域不仅可以定义变量,还可以定义结构体,定义函数等对于结构体的定义就是命名空间的名字要写在中间int x = 10;int val;int main()错误的。原创 2024-03-20 14:04:55 · 545 阅读 · 0 评论