
C++
文章平均质量分 79
C++相关
Pyrojewel_js
你不应该拘泥于任何特定的技术,而应该拥有足够广泛的背景和经验基础,以便在特定的情况下选择合适的解决方案。你的背景来自对计算机科学基本原理的理解,而你的经验来自广泛的实际项目。理论结合实践才会让你变得强大。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【C++】详解模板类型推导
从这样的角度来看,C++的模板类型推导毫无疑问取得了巨大的成功:成百上千的程序员都在向函数模板传递实参,并拿到了完全满意的结果,而其中鲜有人能够将类型推导的过程阐述出来。依照按值传递形参的类型推导规则,此时ptr的const性会被忽略,param被推导成const char*,即一个指向可以改变的,指向一个const字符串的指针(或者说顶层const在值传递的过程中被消除),在推导过程中,ptr指向对象的常量性会被保留,但自身的常量性被忽略。在这种情况下,T的类型会被推导成实际的数组类型!原创 2024-10-15 01:42:15 · 951 阅读 · 0 评论 -
【C++】静态扫描工具Helix QAC的介绍和使用
QA-C 是由英国 PRQA 公司(该公司于2019年被美国Perforce公司收购)开发的静态代码分析工具,该公司是静态代码分析领域的行业先驱。Perforce(PRQA)公司是AUTOSAR组织在代码静态分析领域的唯一会员,负责功能安全软件架构的相关标准制定工作,参与编写了C++14编码指南,制定了AUTOSAR测试方案,并应用其开发的静态测试工具Helix QAC在AUTOSAR Adaptive Platform演示代码上执行代码静态测试。原创 2023-05-15 20:03:22 · 6333 阅读 · 0 评论 -
【C++】操作符替代名
需要注意的是,操作符替代名是一种文本替换机制,编译器在预处理阶段将替代名替换为相应的操作符。因此,替代名不会改变实际的操作符行为,仅仅是提供了一种更直观的表示形式。在上面的示例中,我们使用#define定义了一个名为ADDITION的替代名,它表示加法操作符+。在使用操作符替代名时,需要小心避免与现有的C++关键字或标识符冲突,并确保替代名的命名规范和语义准确性,以避免代码理解上的混淆和错误。上面的示例中,我们为位运算符&定义了一个替代名BITWISE_AND,然后在主函数中使用该替代名进行按位与操作。原创 2024-02-01 10:42:35 · 555 阅读 · 0 评论 -
【算法】LRU算法
它的弊端很明显,如果Cache的数量少,问题不会很大, 但是如果Cache的空间过大,达到10W或者100W以上,一旦需要淘汰,则需要遍历所有计数器,其性能与资源消耗是巨大的。双链表LRU的原理: 将Cache的所有位置都用双链表连接起来,当一个位置被命中之后,就将通过调整链表的指向,将该位置调整到链表头的位置,新加入的Cache直接加到链表头中。这样,在多次进行Cache操作后,最近被命中的,就会被向链表头方向移动,而没有命中的,则向链表后面移动,链表尾则表示最近最少使用的Cache。原创 2024-01-09 10:00:36 · 703 阅读 · 0 评论 -
【C++】十大排序算法
首先找出元素的最大最小值,然后统计每个元素i出现的次数,然后放入数组i中,数组中存放的是值为i的元素出现的个数。如果是升序排序,则每次选择最小值就行,这样已经排好序的部分都是生序排序选择排序是不稳定的,比如说(55231这种情况,两个5的相对顺序会变)基数排序的思想是,从个位依次开始排序,首先按照个位的大小排序,将改变的序列按照十位开始排序,然后一次往后……4)从I开始向后搜索,即由前开始向后搜索(I=I+1即I++),找到第一个大于 key 的A[i],A[i]与A[j]交换;原创 2024-01-09 09:41:38 · 1258 阅读 · 0 评论 -
【C++】一文理清override,overload,overwrite
在平时的工作交流中,有很多C++程序员对它们的概念模糊不清,经常误用或者混用这3个概念,所以在说明override说明符之前,我们先梳理一下三者的区别。原创 2024-01-04 09:37:38 · 2388 阅读 · 0 评论 -
浅谈C++中如何重载前置++/--与后置++/--
其实,前置++与后置++的功能”先加后用“与”先用后加“已经为这两种操作符的实现指明了路线:既然是先加后用,那加完之后的和最后使用的应当是同一样东西,所以应当返回引用。同理,”先用后加“说明应当先把原来的值保存起来,再将其加1,但是最后还是应当返回其原来的值,因为是”先用后加“嘛。另外,你还应当注意,这里保存完原来的值之后,直接调用了前置++去实现加1,这种操作很好的实现了复用,应当被提倡。于是,为了填平这个语言上的漏洞,只好让后置式有一个int自变量,在其被调用的时候,编译器默默为该int指定一个0值。原创 2023-11-27 18:51:10 · 1001 阅读 · 0 评论 -
浅谈STL中的分配器
分配器是STL中的六大部件之一,是各大容器能正常运作的关键,但是对于用户而言确是透明的,它似乎更像是一个幕后英雄,永远也不会走到舞台上来,观众几乎看不到它的身影,但是它又如此的重要。作为用户,你几乎不用关心它的底层是怎么实现的,甚至也很少有能使用到它的机会。这里简单聊一下我对它的认识。原创 2023-11-25 14:49:27 · 1090 阅读 · 0 评论 -
【C++】详解EBO:空基类优化
看侯捷的STL课时,常常听他抱怨STL 4.9版本的一些做法实在令人费解,听得多了难免有些疑问,难道真的是这样吗?怎么会逆历史潮流向后倒退呢?于是开始去找STL团队背后这样做的原因。原创 2023-11-11 18:06:49 · 531 阅读 · 0 评论 -
【C++】详解 void*
void*类型的指针其实本质就是一个过渡型的指针状态,必须要赋予类型(强制类型转换)才能正常使用。void *的范围较大,所以强制转换,使其进行范围缩小。只能单向类型转换。void*可以转化成其他类型,但是有类型的不能转化成void*。在函数调用过程中的使用作为输入输出参数也非常好用,可以灵活使用任意类型的指针,避免只能使用固定类型的指针。原创 2023-11-08 16:53:48 · 1547 阅读 · 0 评论 -
【C++】一文详解lambda表达式用法及发展历程
以上介绍了lambda表达式的语法、使用方法以及原理。总的来说lambda表达式不但容易使用,而且原理也容易理解。它很好地解决了过去C++中无法直接编写内嵌函数的尴尬。虽然在GCC中提供了一个叫作nest function的C语言扩展,这个扩展允许我们在函数内部编写内嵌函数,但这个特性一直没有被纳入标准当中。当然我们也并不用为此遗憾,因为现在提供的lambda表达式无论在语法简易程度上,还是用途广泛程度上都要优于nest function。原创 2023-09-02 14:11:19 · 1590 阅读 · 0 评论 -
【C++】一文解析std::binary_function、std::bind1st、std::bind2nd、std::bind
STL中有一个叫做“适配器”的概念,它指的是某些函数可能定义了两个形参,但是某些算法需要的函数却有时候需要一个形参,那么就需要对其进行适配,将原本只需要两个参数的函数转变成需要1和参数就能正常运行的函数。就像你为你的笔记本充电,能直接一根火线一根零线直接接在你的电脑上吗?肯定也是需要一个适配器将国内标准电压转化成笔记本需要的额定电压。“适配器”就是由此而来。原创 2023-09-02 10:55:03 · 961 阅读 · 0 评论 -
【C++】C++中的auto与decltype
decltype和auto的使用方式有一些相似之处,但是推导规则却有所不同,理解起来有一定难度。不过幸运的是,大部分情况下推导结果能够符合我们的预期。另外从上面的示例代码来看,在通常的编程过程中并不会存在太多使用decltype的情况。实际上,decltype说明符对于库作者更加实用。因为它很大程度上加强了C++的泛型能力,比如利用decltype和SFINAE特性让编译器自动选择正确的函数模板进行调用等,当然这些是比较高级的话题了。原创 2023-07-15 17:20:35 · 601 阅读 · 0 评论 -
【C++】C++泛型编程之函数模板
模板是一个通用框架,是C++泛型编程思想的主要体现。原创 2023-07-03 17:06:27 · 310 阅读 · 0 评论 -
【C++】一文理清C++中的五种强制类型转换
C风格的强制类型转换很容易理解,不管什么类型都可以直接进行转换。C++也支持C风格的强制类型转换,但是C风格的强制类型转换可能会带来一些隐患,出现一些难以察觉的问题,所以C++又推出了四种新的强制类型转换来替代C风格的强制类型转换,降低使用风险。原创 2023-06-29 17:37:15 · 653 阅读 · 0 评论 -
【C++】浅析C++中的虚函数
虚函数(Virtual Function)是通过虚函数表(Virtual Table,简称为V-Table)来实现的。虚函数表主要存储的是指向一个类的虚函数地址的指针,通过使用虚函数表,继承、覆盖的问题都都得到了解决。假如一个类有虚函数,当我们构建这个类的实例时,将会额外分配一个指向该类虚函数表的指针,当我们用父类的指针来操作一个子类的时候,这个指向虚函数表的指针就派上用场了,它指明了此时应该使用哪个虚函数表,而虚函数表本身就像一个地图一样,为编译器指明了实际所应该调用的函数。原创 2023-06-29 14:56:36 · 457 阅读 · 0 评论 -
【C++】关于函数指针的定义方式
这种比较好理解,定义一种返回值为void,形参1为int,形参2为int,这种类型的函数指针,并为这种指针取名为myfunction1;使用的时候也像平时定义普通变量一样去使用就行;原创 2023-06-25 19:30:57 · 1826 阅读 · 0 评论 -
【C++】一文读懂C++中的异常处理机制
程序有时会遇到运行阶段错误,导致程序无法正常地运行下去。例如,程序可能试图打开一个不可用的文件,请求过多的内存,或者遭遇不能容忍的值。通常,程序员都会试图预防这种意外情况。C++异常为处理这种情况提供了一种功能强大而灵活的工具。对于上述表达式,如果y是x的负值,则上述公式将导致被零除——一种不允许的运算。对于被零除的情况,很多新式编译器通过生成一个表示无穷大的特殊浮点值来处理,cout将这种值显示为Inf、inf、INF或类似的东西;而其他的编译器可能生成在发生被零除时崩溃的程序。原创 2023-06-24 15:58:00 · 2115 阅读 · 0 评论 -
【C++】关于友元类与友元函数
友元类:友元类的所有方法都可以访问原始类的私有成员和保护成员,比如模拟电视机和遥控器之间的关系,需要使用友元的另一种情况是,函数需要访问两个类的私有数据,友元声明可以位于公有,私有或保护部分,其所在的位置无关紧要。需要记住的一点是,对于使用Remote对象的Tv方法,其原型可在Remote类声明之前声明,但必须在Remote类声明之后定义,以便编译器有足够的信息来编译该方法。与前一个程序示例不同的是,只有一个Remote方法是Tv类的友元,而在原来的版本中,所有的Remote方法都是Tv类的友元。原创 2023-06-23 17:06:18 · 613 阅读 · 0 评论 -
【C++】第14章: C++中的代码重用
C++的一个主要目标是促进代码重用。公有继承是实现这种目标的机制之一,但并不是唯一的机制。本章将介绍其他方法,其中之一是使用这样的类成员:本身是另一个类的对象。这种方法称为包含,组合或层次化。另一种方法是使用私有或保护继承。原创 2023-06-23 15:39:28 · 1416 阅读 · 0 评论 -
【C++】一文理清C++模板的具体化(隐式实例化,显式实例化,显式具体化,部分具体化)
在学习C++的模板时,经常遇到这四个概念:隐式实例化,显式实例化,显式具体化,部分具体化,但是这四个概念到底在讲些什么东西呢?他们在什么场景下会被使用?又如何区分呢?可能很多小伙伴不能立即分辨出来,所以,接下来让我们理清这四个概念之间的差别原创 2023-06-21 10:55:58 · 3152 阅读 · 1 评论 -
【C++】关键字:static
在这一章节,将对C++中的关键字static做进一步介绍。原创 2023-05-31 11:09:59 · 541 阅读 · 0 评论 -
【C++】如何获取当前正在运行的函数的名称?
是一个非标准的宏,在C++98和C++03标准中被定义为预处理器扩展。例如,如果您有一个名为 MyClass::myFunction() 的成员函数,则。时,其类型因实现而异,通常为 const char* 或 const char[]。时,它与函数名称具有相同的类型,即 const char[]。综上所述,虽然这两个宏都可以用于获取当前函数的名称字符串,但。都是预定义的宏,用于在编译时获取当前函数的名称字符串。: 不仅能获取函数的名称,同样也能获取函数传递的参数。: 主要是获取函数的名称。原创 2023-04-13 09:51:34 · 2578 阅读 · 0 评论 -
【C++】队列模拟问题
Heather银行打算在Food Heap超市开设一个自动柜员机(ATM)。Food Heap超市的管理者担心排队等待使用ATM的人流会干扰超市的交通,希望限制排队等待的人数。Heather银行希望对顾客排队等待的时间进行估测。要编写一个程序来模拟这种情况,让超市的管理者可以了解ATM可能造成的影响。Heather银行的代表介绍:通常,三分之一的顾客只需要一分钟便可获得服务,三分之一的顾客需要两分钟,另外三分之一的顾客需要三分钟。另外,顾客到达的时间是随机的,但每个小时使用自动柜员机的顾客数量相当稳定。设计原创 2023-04-11 16:51:01 · 971 阅读 · 0 评论 -
【C++】基础篇
八股文面试基础篇转载 2023-04-10 14:13:10 · 613 阅读 · 1 评论 -
【C++】静态类成员
类中静态成员的特点是:无论创建了多少对象,程序都只创建一个静态类变量副本。也就是说,类的所有对象共享同一个静态成员,就像家中的电话可被全体家庭使用一样。但是注意,,这是因为类声明描述了如何分配内存,但并不分配内存。但是一种例外情况是,(请注意这里,C++primer plus里说的是:但是一种例外情况是,静态数据成员为整型或枚举型const。原创 2023-04-08 11:54:40 · 471 阅读 · 0 评论 -
【C++】枚举的升级版本:作用域内枚举
C++11 作用域内枚举原创 2023-04-02 18:20:53 · 309 阅读 · 1 评论 -
【C++】如何写好一个宏定义语句?
关于宏定义请务必牢记一点: C++中的关键字define执行的仅仅是简单的文本替换。原创 2023-04-02 13:34:49 · 550 阅读 · 0 评论 -
【C++】namespace 命名空间
然而,使用using编译指令时,将进行名称解析,就像在包含using声明和名称空间本身的最小声明区域中声明了名称一样。如果使用using编译指令导入一个已经在函数中声明的名称,则局部名称将隐藏名称空间名,就像隐藏同名的全局变量一样。具体地说,不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。如果试图使用using声明将名称空间的名称导入该声明区域,则这两个名称会发生冲突,从而出错。如果使用using编译指令将该名称空间的名称导入该声明区域,则局部版本将隐藏名称空间版本。原创 2023-04-01 14:53:34 · 681 阅读 · 0 评论 -
【C++】关键字:decltype
同样,无法预先知道将x和y相加得到的类型。好像可以将返回类型设置为decltype ( x + y),但不幸的是,此时还未声明参数x和y,它们不在作用域内(编译器看不到它们,也无法使用它们)。为此,C++新增了一种声明和定义函数的语法。下面使用内置类型来说明这种语法的工作原理。其中auto是一个占位符,表示后置返回类型提供的类型,这是C++11给auto新增的一种角色。其参数可以是表达式,也可以是普通的变量。它是两个int的和,因此类型为int。说了那么多,其实有一个问题是decltype无法解决的。原创 2023-03-30 20:17:21 · 312 阅读 · 0 评论 -
【C++】宏定义中的续行符 “/“
C++宏定义中的换行符原创 2023-03-27 14:20:05 · 409 阅读 · 0 评论 -
【C++】科普:C++中的浮点数怎么在计算机中表示?
指数位为+3,所以这里的值为127+3=130,130的二进制表示为1000 0010,因此这里为1000 0010。小数位为00001,这里尾数位占用23个字节,位数不够,所以补0,因此这里为:00001后面补18个0。首先,明确一个概念,float类型的数据在常规计算机中通常占4个字节,也就是32位。请根据引言中的注意事项,可以推理出:在二进制的科学计数法中:整数部分的取值只能是1,是个固定值。在这一阶段,我们得出结果:8.25的二进制表示为:1000.01。首先:整数部分为8,二进制表示为1000;原创 2023-03-24 15:56:31 · 1316 阅读 · 2 评论 -
【C++】Clang-Format:代码自动格式化(看这一篇就够了)
ClangFormat格式化控制工具介绍原创 2023-03-07 15:31:48 · 34449 阅读 · 2 评论 -
【C++】cin的处理过程
使用cin进行输入时,程序将输入视为一系列的字节,其中每个字节都被解释为字符编码。不管目标数据类型是什么,输入一开始都是字符数据——文本数据。然后,cin对象负责将文本转换为其他类型。为说明这是如何完成的,来看一些处理同一个输入行的代码。38.5 19.2来看一下使用不同数据类型的变量来存储时,cin是如何处理该输入行的。原创 2023-02-17 18:46:17 · 1348 阅读 · 0 评论 -
【C++】编程实例:循环与文本输入问题
不过要记住的是,在有些系统中,按Ctrl+Z实际上将结束输入和输出,而cin.clear( )将无法恢复输入和输出。由于这种原因,如果使用cin.get( )(没有参数)并测试EOF,则必须将返回值赋给int变量,而不是char变量。通常,EOF被定义为值−1,因为没有ASCII码为−1的字符,但并不需要知道实际的值,而只需在程序中使用EOF即可。下面的程序体现了这一点。综上:如果编程环境能够检测EOF,可以在类似于程序清单5.17的程序中使用重定向的文件,也可以使用键盘输入,并在键盘输入中模拟EOF。原创 2023-02-17 13:16:31 · 1412 阅读 · 0 评论 -
【C++】自动存储,静态存储与动态存储
在栈中,自动添加和删除机制使得占用的内存总是连续的,但new和delete的相互影响可能导致占用的自由存储区不连续,这使得跟踪新分配内存的位置更困难。这意味着执行代码块时,其中的变量将依次加入到栈中,而在离开代码块时,将按相反的顺序释放这些变量,这被称为后进先出(LIFO)。在函数内部定义的常规变量使用自动存储空间,被称为自动变量(automatic variable),这意味着它们在所属的函数被调用时自动产生,在该函数结束时消亡。实际上,将会无法访问自由存储空间中的结构,因为指向这些内存的指针无效。原创 2023-02-16 19:33:46 · 871 阅读 · 0 评论 -
【cmake】make install/strip:减小目标占用的空间大小
strip 命令可大大减少程序的占用空间,软件发布时可使用该命令针对可执行程序和动态度进行处理。上面列出的方法中,推荐使用 3.1 和 3.2。因为这两个命令只会对目标(target)产生影响,并且,只有在 CMAKE_BUILD_TYPE 为 Release 时才会产生作用,即 cmake -DCMAKE_BUILD_TYPE=Release …。原创 2023-02-06 16:50:22 · 2309 阅读 · 1 评论 -
【C++】关键字:virtual 虚函数 虚基类
virtual在英文中表示“虚”、“虚拟”的含义。c++中的关键字“virtual”主要用在两个方面:虚函数与虚基类。下面将分别从这两个方面对virtual进行介绍。原创 2023-02-02 12:04:44 · 2175 阅读 · 0 评论 -
【C++】 =delete
今天看编程规范,其中有个原则:如果你的类不需要拷贝/移动操作,请显式的通过在public域中(private本身就是不能显式的直接调用的)使用 =delete 或其他手段禁用之;对其中的 =delete不了解,之前没用过,查了一下以此为记;原创 2023-01-15 16:16:35 · 326 阅读 · 0 评论 -
【C++】左值引用与右值引用
左值和右值在C语言中可以简单的理解为:左值可以位于赋值运算符的左侧,右值则不能位于运算符左侧但是在C++中左值和右值就明显的复杂很多,C++中的左值和右值在《C++ primer》中这样归纳:当一个对象被用作右值的时候用的是对象的值(内容),当一个对象被用作左值的时候,用的是对象的身份(在内存中的位置)。简单说来就是左值可以被修改(可以取地址),而右值不能被修改(不能取地址)。原创 2023-01-15 14:38:24 · 524 阅读 · 0 评论