
C++
文章平均质量分 95
cpp学习专栏
利刃大大
不怕山高,只怕腿软
展开
-
【C++11】闭包:仿函数operator() && 绑定器bind && 包装器function && lambda表达式
闭包有很多种定义, 一种说法是, 闭包是带有上下文的函数。说白了, 就是有状态的函数,就是有自己的变量。更直接一些,就是一个类换了个名字而已。一个函数, 带上了一个状态, 就变成了闭包了。那什么叫“带上状态”呢?意思是这个闭包有属于自己的变量, 这些个变量的值是创建闭包的时候设置的, 并在调用闭包的时候, 可以访问这些变量。函数是代码, 状态是一组变量, 将代码和一组变量捆绑 (bind) , 就形成了闭包。闭包的状态捆绑, 必须发生在运行时。原创 2025-04-14 14:47:31 · 1024 阅读 · 0 评论 -
【C++11】右值引用 && 移动语义 && 完美转发
左值是一个表示数据的表达式(如变量名或解引用的指针),我们可以获取它的地址或者可以对它赋值,左值可以出现在 =的左边,右值不能出现在 =表达式左边。定义时 const修饰符后的左值,不能给他赋值,但是可以取它的地址。左值引用就是给左值的引用,给左值取别名。 简单的说,能取地址的就是左值!(虽然 C++11将 const修饰的变量认为虽然不能修改值,但是它还是能修改地址的,所以将常量视为左值int main()// 以下的p、b、c、*p都是左值int b = 1;原创 2025-04-03 09:21:31 · 868 阅读 · 0 评论 -
【C++11】一些易用性的改进
用户定义字面量,也被称为【自定义后缀】,其主要作用就是为了简化代码的读写!返回值类型 operator"" 自定义后缀名称(参数列表)函数体// 用户自定义字面值, 或者叫“自定义后缀”更直观些, 主要作用是简化代码的读写。// 自定义变量,名字要求operator"" xxxreturn x;// 运行结果0.00111000 这种新语法其实很容易理解:#include。原创 2025-03-19 13:16:47 · 926 阅读 · 0 评论 -
【C++11】auto && decltype && nullptr
是一个存储类型的说明符,表明变量是局部自动存储类型,但是局部域中定义局部的变量默认就是自动存储类型,所以 auto。但有时候可能需要根据表达式运行完成之后结果的类型进行推导,因为编译期间,代码不会运行,此时 auto。既能指针常量,又能表示整形常量。所以出于清晰和安全的角度考虑,将变量的类型声明为表达式指定的类型。,这样就可能回带来一些问题,因为 0。 💡 关键字 decltype。可以让你声明一个变量, 而。中新增了 nullptr。实际上有点像 auto。 所以 C++11。原创 2025-03-13 17:50:30 · 643 阅读 · 0 评论 -
【C++11】新的类功能
如果在构造函数中没有给该成员变量赋值的话,那么才会采用这个初始缺省值!原创 2025-03-11 12:18:12 · 1365 阅读 · 0 评论 -
【C++】可变参数模板
ShowList函数中的逗号表达式:(PrintArg(args),0),也是按照这个执行顺序,先执行 PrintArg(args),再得到逗号表达式的结果 0。同时还用到了。原创 2025-03-06 13:17:42 · 1028 阅读 · 0 评论 -
【C++】模板的改进
在 的泛型编程中,模板实例化有一个很繁琐的地方,就是连续两个右尖括号 会被编译解释成右移操作符,而不是模板参数表的形式,需要一个空格进行分割,以避免发生编译时的错误。 在实例化模板时会出现连续两个右尖括号,同样 、 、 、 表达式转换时也会遇到相同的情况。 标准是让程序员在 之间填上一个空格,而在 中,这种限制被取消了! 在 标准中,要求编译器对模板的右尖括号做单独处理,使编译器能够正确判断出 是一个右移操作符还是模板参数表的结束标记。 模板别名其实就是就是利用模板和起别名两个特性原创 2025-03-04 13:21:24 · 1189 阅读 · 0 评论 -
【C++】智能指针 && 守卫锁
内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。// 1. 内存申请了忘记释放// 2. 异常安全问题Func();// 这里Func函数抛异常导致delete[] p3未执行,p3没被释放。原创 2025-03-02 14:43:19 · 944 阅读 · 0 评论 -
【C++11】统一的 {} 列表初始化
使用初始化列表时,可添加等号 =,也可不添加。 初始化列表的优点在于可。原创 2025-02-28 13:12:37 · 1319 阅读 · 0 评论 -
【C++】unordered系列容器的模拟实现
由哈希表的知识我们可知开散列其实是比闭散列有优势的,所以下面的实现都是基于开散列的基础实现的!原创 2025-02-26 21:21:45 · 1075 阅读 · 0 评论 -
【C++】万字详解 set 与 map 的模拟实现
我们前面实现了红黑树的插入以及删除(删除有一点 bug),因此我们就能用其来实现 map以及 set,这里只涉及了之前红黑树的插入,因为我们的重点是 map与 set是如何同时使用红黑树实现的以及红黑树的迭代器是如何实现的!原创 2025-02-20 09:35:22 · 1047 阅读 · 0 评论 -
【C++】详解 set && multiset && map && multiset 的使用
set的文档介绍set是按照一定次序存储元素的容器在 set中,元素的 value也标识它,并且每个 value必须是唯一的。set中的元素不能在容器中修改(元素总是 const),但是可以从容器中插入或删除它们。在内部,set中的元素总是按照其内部比较对象(类型比较)所指示的特定严格弱排序准则进行排序。set容器通过 key访问单个元素的速度通常比 unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代。set在底层是用红黑树实现的。multiset文档介绍。原创 2025-02-15 10:55:06 · 1525 阅读 · 0 评论 -
【C++】详解 stack && queue && priority_queue && deque
stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。stack是作为容器适配器实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。标准容器vectordequelist均符合这些需求,默认情况下,如果没有为 stack指定特定的底层容器, 默认情况下使 deque(双向队列)。stackempty():判空操作back()原创 2025-02-11 16:13:47 · 1010 阅读 · 0 评论 -
【C++】string类的模拟实现
string的文档网站string是一个管理字符数组的类,要求这个字符数组结尾用\0标识拷贝构造和赋值重载实现深拷贝增删查改的相关接口[]>><<等迭代器对于一个成员函数,什么时候该加const呢?如果是只读函数,则要加 const如果是只写函数,则不能加 const如果既是可读又是可写的函数,则要重载两个版本的函数,即const版本与非const版本。原创 2025-02-06 12:15:23 · 1153 阅读 · 0 评论 -
【C++】泛型编程:吃透模板
泛型编程:编写与类型无关的通用代码,是代码复用的一种手段。而模板是泛型编程的基础。 其中,模板分为两类,一类是函数模板,一类是类模板。class 类模板名// 类内成员定义不用再去typedef类型! 我们之前 C语言中对于一些数据结构比如 stack,我们在设置 int类型的时候,只能去 typedef为 int,然后如果需要 double则重新去 typedef为 double,非常麻烦,而且这种方式做不到同时申请一个 int类型和 double类型的 stack。原创 2025-02-04 13:25:20 · 1292 阅读 · 0 评论 -
【C++】vector的使用与实现详解
vector的文档介绍vector是表示可变大小数组的序列容器(动态数组),包含三个迭代器,start和 finish之间是已经被使用的空间范围,end_of_storage是整块连续空间(包括备用空间的尾部)。就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对 vector的元素进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自动处理。本质讲,vector使用动态分配数组来存储它的元素。原创 2025-01-29 13:44:42 · 1403 阅读 · 0 评论 -
【C++】设计模式详解:单例模式
不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写反而还简单,而且如果定义了就做不到防止成员函数内部拷贝了。原创 2025-01-28 20:21:26 · 2023 阅读 · 0 评论 -
【C++】看不懂多态?这篇文章带你吃透它!
该内容中的代码以及解释都是在 vs2022下的 x86环境中,涉及的指针都是 4个字节,如果要在其他的平台下运行,部分代码需要改动。继承关系。必须通过基类的指针或者基类的引用调用虚函数,这个过程也称为向上转型。被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行了重写。 那么问题来啦,什么是虚函数?重写又是什么?请看下面!两个函数必须在同一作用域。函数名相同,参数不同。两个函数分别在基类和派生类的作用域中。只要求函数名相同。原创 2025-01-24 15:25:47 · 1074 阅读 · 0 评论 -
【C++】2w字带你吃透继承!
派生类 继承方式 基类👇 👇 👇public:int _Stuid;// 学号 我们以上面为例子,People是父类,也称为基类。而 Student叫做子类,也称为派生类。 🔴c++中若不写继承方式,默认就是private继承!很多人说 C++语法复杂,其实多继承就是一个体现。有了多继承,就存在菱形继承,有了菱形继承就有菱形虚拟继承,底层实现就很复杂。所以一般不建议设计出多继承,一定不要设计出菱形继承。否则在复杂度及性能上都有问题。多继承可以认为是 C++原创 2025-01-16 14:19:17 · 1391 阅读 · 0 评论 -
【C++】你了解异常的用法吗?
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了。// 服务器开发中通常使用的异常继承体系public:, _id(id){}virtual string what() const // 获取错误信息protected:// 错误描述int _id;// 错误id// 数据库异常public:{}原创 2025-01-04 13:46:45 · 774 阅读 · 0 评论 -
【C++】你只会强制类型转换吗?来看看C++的骚操作吧!
强制类型转换关闭或挂起了正常的类型检查,每次使用强制类型转换前,程序员应该仔细考虑是否还有其他不同的方法达到同一目的,如果非强制类型转换不可,则应限制强制转换值的作用域,以减少发生错误的机会。原创 2025-01-03 13:27:37 · 900 阅读 · 0 评论 -
【C++】IO流详解
在C语言中,如果想要将一个整形变量的数据转化为字符串格式,如何去做?使用itoa()函数使用sprintf()函数但是两个函数在转化时,都得需要先给出保存结果的空间,那空间要给多大呢,就不太好界定,而且转化格式不匹配时,可能还会得到错误的结果甚至程序崩溃。在C++中,可以使用类对象来避开此问题。在程序中如果想要使用,必须要包含头文件。和,分别用来进行流的输入、输出和输入输出操作,本文主要介绍 stringstream。原创 2022-08-09 14:43:29 · 4060 阅读 · 6 评论 -
C++入门必备知识(你真的入门C++了吗?)
知识点详细全面!原创 2022-05-21 16:53:54 · 983 阅读 · 4 评论