![](https://img-blog.csdnimg.cn/direct/9d85272f4be24588ad78c94d88341ed6.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
C++从入门到入土
文章平均质量分 93
C++的学习之路
无聊看看天T^T
事以密成,语以泄败
展开
-
C++中的类型转换操作符:static_cast && reinterpret_cast &&const_cast && dynamic_cast
为了能控制向下转型时的越界问题、C++提供了dynamic_cast类型转换操作符,dynamic_cast会在转换前检查是否能转换成功,可以转换就转换、不能转换就返回0原创 2024-07-01 16:11:47 · 778 阅读 · 0 评论 -
C++的特殊类设计 && 饥饿汉模式
一个类只能创建一个对象,即单例模式,该模式可以保证系统中该类只有一个实例,并提供过一个访问它的全局访问点,该实例被所有程序模块共享原创 2024-06-23 22:55:37 · 851 阅读 · 0 评论 -
C++的智能指针 && RAII
的技术,确保资源的获取与对象的创建同步,资源的释放与对象的销毁同步,从而简化资源管理并帮助避免资源泄漏和异常安全问题。(如内存、文件句柄、网络连接、互斥量等)是一种利用对象生命周期来控制程序资源。原创 2024-06-20 23:36:07 · 680 阅读 · 0 评论 -
C++的异常捕获
3、找到匹配的catch子句并处理后,会继续执行catch子句后的非try...catch块中的内容。(异常是一种运行时错误,可以中断程序的正常流程,常见的异常包括除零错误、文件未找到、网络连接失败等)需要程序员自己去查找对应的错误,如系统的很多库的接口函数都是通过把错误码放到errno中,表示错误。如果异常未被捕获,它会向调用栈的上传递,直到找到一个处理器,如果找不到一个处理器就会使程序终止。,并将控制权转移到预定的异常处理逻辑中。太过强硬,如果发生内存错误,或者除0语法错误等就会直接终止程序。原创 2024-06-14 15:52:01 · 1006 阅读 · 0 评论 -
C++11:可变参数模板 && emplace_back
emplace_back是C++11提供的一个基于可变参数模板实现的新的成员函数原创 2024-06-12 14:13:02 · 257 阅读 · 0 评论 -
C++11:右值引用 && 移动语义 &&完美转发
左值引用没有解决的问题(局部对象做返回值时不能使用传引用返回,需要传值返回 + 两次拷贝构造)右值引用解决了(移动构造 + 移动赋值使得传值返回时可以不用经历拷贝,只需要交换资源即可),我们把移动构造和移动赋值叫做右值引用的移动语义原创 2024-06-11 16:57:20 · 1210 阅读 · 0 评论 -
C++11:列表初始化 && 初始化列表initializer_list && decltype关键字
{10, 20, 30, 40, 50}在正常情况下还是列表初始化,但是当{10, 20, 30, 40, 50}要作为函数参数(printList({10, 20, 30, 40, 50}))或者要赋值给一个自定义类型时,编译器会将{10, 20, 30, 40, 50}构造成一个initializer_list类型的匿名对象(initializer_list{10, 20, 30, 40, 50};) ,然后将该对象向某个函数传参(printList({10, 20, 30, 40, 50})原创 2024-06-06 19:09:57 · 1943 阅读 · 0 评论 -
C++哈希的应用:位图 && 布隆过滤器 && 哈希切割
有四十个亿未排序的不重复的无符号整数,此时提供一个无符号整数如何快速判断某个无符号整数是否在这40个亿数中?遍历,时间复杂度为O(N)(先)排序 + 二分查找,时间复杂度为O(logN)(不如位图的原因是排好序后如果进行插入删除麻烦,尤其是很多数时在0下标插入,需要挪动大量的数据,删除同样也要挪动大量数据,即排完序后是很好找,但麻烦在插入和删除,因此对于需要快速判断元素是否存在,并且需要频繁进行插入和删除操作的情况,使用位图是一个更好的选择)位图。原创 2024-06-01 18:23:44 · 764 阅读 · 0 评论 -
C++的哈希 && 哈希表 && 哈希桶
C++98中,STL提供了底层为红黑树结构的一系列关联式容器,在查询时效率可以达到log_2 N,即最差情况下要比较红黑树的高度次: 当树中的结点特别多且有序时,以红黑树为底层结构的多个关联式容器就显得有些不够用了,为此C++11中又提供了4个unordered系列的关联式容器unordered_map、unordered_set、unordered_multimap、unordered_multiset,它们与之前的map、set、multimap、multiset的使用方式基本类原创 2024-05-27 00:11:26 · 2287 阅读 · 0 评论 -
C++的仿函数 && lmabda表达式 && 偏函数
1、仿函数(Functor)又称为函数对象(Function Object)是一个能行使函数功能的类2、每个作为仿函数的类,都必须重载一个或多个函数调用运算符(),这能使得我们几乎可以像调用普通函数那样调用仿函数3、调用仿函数,实际上就是通过类对象调用重载后的(),类对象可以有名也可以是匿名补充:如果编程者要将某种“操作”当做算法的参数,一般有两种方法:将该“操作”设计为一个函数,再将函数指针当做算法的一个参数。将该“操作”设计为一个仿函数,再实例化它的对象,并以此对象作为算法的一个参数。原创 2024-05-17 15:57:55 · 454 阅读 · 0 评论 -
C++的map和set
multiset的find方法默认查找的是中序的第一个,查找值为x的结点,查找到x的结点后,这个结点的左子树没有值为x结点,它就是中序的第一个值为x的结点。不仅仅是存储数据,一般还可以查找数据,存储的数据和数据间有很强的关联性。单纯的存储数据,存储的数据和数据之间关联度低。原创 2024-05-17 15:25:14 · 535 阅读 · 0 评论 -
C++的多态
并且最好把基类的析构函数定义成虚函数,在进行动态内存分配和释放(如 new/delete、malloc/free 等)以及使用容器(如 std::vector、std::map 等)等场景下经常需要使用到析构函数作为虚函数。这样可以确保在删除某个派生类型对象时能够正确地释放其所占据内存空间,并依次递归调用所有祖先VTables 所关联但不包括其他VTables 的“virtual” 析构方法以完成整个对象图谱上各层级数据成员和资源回收工作原创 2024-04-23 21:14:30 · 861 阅读 · 0 评论 -
C++的继承
STL中不同的“容器”的迭代器在使用时是一样的,但实际上迭代器的底层实现并不相同,对于vector、string等空间连续的“容器”,它们的迭代器可以直接使用原生指针,而对于list、stack和quque等空间不连续的“容器”,它们的迭代器需要对原生指针进行封装后才能使用在STL中,“容器”指代各种数据结构,容器的概念是在docker中才出现的封装:数据和方法放在一起,将可以被外部访问的定义成共有,不想访问的定义成私有和保护。原创 2024-04-18 20:44:32 · 1019 阅读 · 0 评论 -
C++类和对象(六):初始化列表 && static成员
即使在原内容中并没有明确的写出要初始化该自定义类型的成员变量,如果没有默认构造函数就会报错原创 2024-03-10 23:54:52 · 462 阅读 · 0 评论 -
C++的输入与输出
由于不同编译器所提供给的头文件的内容可能会略有差异,所以如果仅包含了iostream头文件就可以正常使用printf函数,那就直接用,如果不能就再包含stdio.h文件原创 2024-02-26 20:22:55 · 283 阅读 · 0 评论 -
STL的list(一):基本概念
vector的insert和erase都会导致迭代器失效list的insert不会导致迭代器失效,erase会导致迭代器失效insert导致失效的原因是开辟了新空间后,迭代器扔指向原空间erase导致失效的原因是销毁的空间不是连续的空间,迭代器找不到下一块小空间的位置。原创 2024-04-07 21:07:03 · 1074 阅读 · 0 评论 -
STL的string(一):基本概念 && 常见操作
从字符串的pos开始向后复制len个字符,如果字符串太短或len的大小为string类中的npos,则复制到str的末尾。e size_t(nops是一个静态成员常量,具有size_t类型元素的最大可能值(2^32)- 1)迭代器(iterator)是一种检查容器内元素并遍历元素的数据类型,通常用于对C++中各种容器。(不给len时默认从pos位置起拷贝至字符串末尾止)复制指针s指向的c字符串(包含\0的字符串)内元素的访问,不同的容器有不同的迭代器。(迭代器是一个行为像指针一样的类型)原创 2024-03-16 20:53:27 · 1244 阅读 · 0 评论 -
C && C++内存管理
高效的I/O映射方式,用于装载一个共享的动态内存库,用户可以使用系统接口创建共享内存,做进程通信。存放非静态局部变量、函数参数、返回值等,栈是向下增长的。用于程序运行时动态内存分配,堆是可以向上增长的。更加高效的管理和读取数据。堆(可以自主控制的区域)存储全局数据和静态数据。可执行的代码、只读常量。原创 2024-03-12 23:40:38 · 222 阅读 · 0 评论 -
C++的类和对象(五):赋值运算符重载 && 日期类
赋值运算符如果不显示实现,编译器会生成一个默认的,此时用户再在类外自己实现一个全局的赋值运算符重载,就和编译器在类中生成的默认赋值运算符重载冲突了,故赋值运算符只能是类的成员函数原创 2024-03-10 15:16:41 · 1167 阅读 · 0 评论 -
C++模板初阶
Swap(a,b)和Swap(d1,d2)使用的是两种不同的Swap函数,根据汇编指令可以观察到这一点,只是提供了一个模板,具体的实现是要交给编译器来实现的。原创 2024-03-14 17:45:36 · 697 阅读 · 0 评论 -
STL的stack和queue(一):适配器模式 && 双端 && 优先级队列
适配器模式是一种设计模式,用于将一个类的接口转换成客户希望的另一个接口,这种类型的设计模式属于结构型模式,它涉及到单个类的功能增强,适配器模式中有三个主要角色:目标接口:客户端所期待使用的接口,适配器通过实现这个目标接口来与用户进行交互被适配者:需要被适配以符合目标接口规范的现有类适配器:实现了目标接口,并持有一个对被适配者对象的引用,在其方法内部调用被适配者对象来完成特定操作原创 2024-04-06 23:25:47 · 479 阅读 · 0 评论 -
C++的类和对象(七):友元 && 内部类
友元提供了一种突破封装的方式,有时提供了便利,但是友元会增加耦合度,破坏了封装,所以友元不宜多用(开后门)friend 函数声明友元函数和友元类类外无法访问成员函数(没必要)原创 2024-03-12 23:16:12 · 772 阅读 · 0 评论 -
C++的引用
在函数结束后硬要把局部变量搞成一个随机值是一件没有意义的事情。只能说函数结束后局部变量的值【不再保证有效】销毁是需要花点力气的,函数销毁后,原来函数的那一片空间变成空闲区域,随时会再次被使用。大部分情况下,你还能输出,是因为没人用到了那片空闲区域!然而机器也懒得去销毁,重置内存也得费电。原创 2024-03-01 23:51:28 · 894 阅读 · 0 评论 -
C++的类和对象(二):this指针
Data类中有Init和Print两个成员函数,不论是d1还是d2它们调用的Init函数和Print函数在实现上是一样的,为什么编译器可以做到d1调用Print函数就会打印d1对象的成员变量组成的日期,d2调用Print函数就会打印d2对象的成员变量组成的日期?一次读取4个字节,先读取i的一个字节和a的前三个字节后将a的前三个字节丢掉,然后继续读取a剩余的一个字节,最后将那三个字节和最后一个字节组合才能得到a,麻烦。一次读取4个字节,先读取一个字节的i后将其它三个没用的字节丢掉,然后继续读取四个字节的a。原创 2024-03-04 23:46:58 · 939 阅读 · 0 评论 -
C++的命名空间
namespace 命名空间域名 {变量名}1、只能定义在全局int x = 0;int x = 1;运行上述代码后仍然报错,这是因为编译器在编译时会按如下顺序对变量进行搜索:①当前局部域②全局域③指定的命名空间域int x = 0;int x = 1;int x = 0;int x = 1;2、命名空间域中可以定义变量/函数/类型。原创 2024-02-26 19:26:10 · 1719 阅读 · 0 评论 -
C++的内联函数
在C语言中可能会遇到频繁调用100次函数的情况,这就意味这需要频繁的创建和销毁栈帧一百次,无疑这会,对此C语言使用了宏来解决这一问题。(运算符的优先级问题)(上面说过了)原创 2024-03-03 01:23:06 · 1152 阅读 · 0 评论 -
C++的类和对象(一):类的定义 && 初始化 && 访问限定符 &&类实例化
类体class:定义类的关键字classname:类的名字类体:类成员的集合,其中的变量称为类的属性或成员变量,函数称为类的方法或成员函数(推荐后者)1、成员的声明和定义全放在类中(成员函数在类中定义,编译器可能会将其当成内联函数处理)2、 成员的声明放在头文件中,成员的定义放在源文件中(成员函数名前需要加类名::)在不加::时,程序在寻找howInfo函数时会以局部域->全局域的顺序寻找,而对于类内部定义的成员函数howInfo(处于类域中的函数)在没有明确指定所属类名时,默认不是为全局可见。原创 2024-03-04 17:50:43 · 819 阅读 · 0 评论 -
STL的vector(一):常见操作 && 模拟实现
STL 的string类怎么啦?C++面试中string类的一种正确写法C++ STL string的Copy-On-Write技术C++的std::string的“读时也拷贝”技术!原创 2024-03-21 21:49:00 · 1074 阅读 · 0 评论 -
C++的缺省参数与函数重载
相当于兑现了之前所做出的承诺。在函数定义中,你提供了完整的代码实现,让编译器知道如何执行这个功能。只有当给定了完整定义并且提供了可执行代码时,该功能就真正变得可用,并且能够被其他部分调用。原创 2024-02-28 23:52:54 · 585 阅读 · 0 评论 -
C++的类和对象(四):拷贝构造函数
这是因为,实例化s1对象时在堆上开辟了个空间用于存放元素,接着s2对象要用s1对象的成员变量进行初始化,Stakc类没有显示定义拷贝构造函数,编译器会生成一份默认的拷贝构造函数,默认拷贝构造函数是按值拷贝的,即将s1中的内容原封不动的拷贝到s2中,对于_size和_capacity没问题,但是_array存放的可是s1在堆上开辟的空间的地址,此时将该地址的值也原封不动的传递给了s2的_array,此时s1和s2对象的_array指向同一片空间,当main函数结束时,原创 2024-03-07 21:01:29 · 871 阅读 · 0 评论 -
STL的list(二):模拟实现 && 迭代器模板
const_iterator而不是const iterator,前者是别名,后者表示迭代器本身不能修改,const迭代器要的是迭代器指向的对象不能被修改而不是迭代器本身不能被修改原创 2024-04-06 23:23:57 · 895 阅读 · 0 评论 -
STL的stack和queue(三):基于适配器模式的反向迭代器
迭代器按性质分类:单向:forward_list双向:list随机:vector / deque迭代器按功能分类:正向反向const。原创 2024-04-12 19:42:59 · 440 阅读 · 0 评论 -
C++11中的auto && 范围for && 指针空值nullptr
在同一行声明多个变量时,变量类型必须相同,否则编译报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量// 该行代码会编译失败,因为c和d的初始化表达式类型不同。原创 2024-03-03 17:34:45 · 1267 阅读 · 0 评论 -
STL的string(三):ASCII码 && 模拟实现
字符集中的字符与计算机二进制序列之间的映射关系(字符对应的二进制序列是多少)1、8个比特位(0和1)对应一个字节,根据排列组合的概念,8个比特位一共可以表示出0~255(无符号位)或-128~127(有符号位)一共256个值2、美国通过规定它们国家的字符与计算机二进制序列之间的映射关系,提出了ASCII美国信息交换标准代码的概念,ASCII码表是这些映射关系的总结:在表上找字符'a'对应的数字,将该数字存放给ch,ch在内存上的值就是'a'对应的数97。原创 2024-03-20 09:18:56 · 1712 阅读 · 0 评论 -
C++的类与对象(三):构造函数 && 析构函数 && 对象销毁顺序
实例化对象时我们不屑构造函数,编译器就会自动生成无参的构造函数,从而初始化对象,但是实际上编译器默认生成的无参的构造参数什么也不干,为什么?(我们程序员没有定义一个构造参数是我们的问题,但是你编译器既然为我们自动生成了一个无参的构造参数,你总得让它起点作用吧,就是只让成员变量初始化为0也行啊)原创 2024-03-06 19:39:41 · 979 阅读 · 0 评论 -
模板的进阶
优点:复用了代码,节省资源,更快的迭代开发,C++的标准模板库也因此而生增强代码灵活性缺点:模板会导致代码膨胀问题,也会导致编译时间变长出现模板编译错误时,错误信息十分混乱,不易定位原创 2024-04-13 21:19:26 · 956 阅读 · 0 评论