- 博客(174)
- 收藏
- 关注
原创 C++ 法测18:热爱才是最大的优势。
摘要:热爱编程才是程序员最大的优势。顶尖程序员也会频繁查文档、写"烂代码",关键在于理解原理而非死记语法。实际解决问题的能力比熟记理论更重要(如解决100道LeetCode题优于背《算法导论》)。记忆力和完美代码并非必需,重构能力和系统思考才是关键。正如Linus Torvalds所说,保持热爱才是最重要的,在编程世界里人人平等。(150字)
2025-06-26 00:52:32
77
原创 C++法则17:当定义函数模板的特例化版本时,我们本质上是接管了编译器的工作。
C++模板特例化允许开发者针对特定类型提供优化实现,接管编译器生成代码的工作。特例化的主要作用包括性能优化、特殊类型处理、边界条件应对和增强类型安全。通过显式特例化,开发者可以完全替换特定参数组合的原始模板实现,而非简单重载。使用时需确保特例化版本与原模板接口完全匹配,适用于需要优化特定类型性能、处理特殊语义或边界情况的场景。特例化赋予开发者对模板实例化的精确控制权,但也要求确保实现的正确性。
2025-06-25 21:54:11
560
原创 C++法则16:当分配一个对象时,尽量NewEmplace代替 new。
C++法则摘要:建议使用NewEmplace替代new来分配对象,可避免不必要的初始化操作。NewEmplace模板函数直接构造对象并返回指针,相比传统new减少了初始化次数。同时强调了new/delete配对使用原则,以及与malloc/free的区别。
2025-06-25 00:46:05
355
原创 C++法则15:匹配失败并不是一种错误(Substitution Failure Is Not An Error)。
摘要:SFINAE(Substitution Failure Is Not An Error)是C++模板元编程的核心原则,指模板参数替换失败时不报错而是忽略该候选。它通过编译器在重载解析时静默排除无效特化来工作,常用于类型检查(如is_class)、条件函数重载(enable_if)和类型约束。现代C++提供了更简洁的替代品:C++17的if constexpr和C++20的Concepts。虽然SFINAE功能强大,但过度使用会降低代码可读性,在新标准中应优先考虑更清晰的替代方案。(150字)
2025-06-24 16:36:27
297
原创 C++可打印任何参数,改进版(支持括号,字符串嵌套)
本文介绍了_pns宏在解析常量字符串参数时出现的bug及解决方案。原版本在处理包含引号、转义字符或括号嵌套的参数时存在缺陷,无法正确分割参数列表。改进后的parseNames函数通过跟踪括号嵌套深度、引号状态和转义字符,能正确处理复杂场景如f("123,456")和嵌套调用f(getvalue<string>("123,456"))。该函数支持C++14和C++17两种实现,采用递归或折叠表达式处理可变参数,并通过_tostr函数实现各种类型到字符串的转换
2025-06-24 13:00:00
311
原创 保存 QTextEdit 内容打包成一个文件(包含文本和图片)
该代码实现了一个功能丰富的Qt文本编辑器控件(my_QTextEdit),主要特性包括: 富文本处理功能 支持图文混排内容的序列化(f_packageToByteArray)与反序列化(f_splitFromByteArray) 可保存/恢复包含图片资源的完整文档 智能编辑功能 自动序号识别与格式设置 章节标题智能识别与样式应用 特殊符号处理 缩进/反缩进操作 高级特性 代码语法高亮(支持C++/Python/Java等多种语言) 右键菜单集成AI功能(DeepSeek解释、百度搜索等) 文本转语音功能 U
2025-06-23 17:27:25
131
原创 C++法则14:如果构造函数或析构函数调用了某个虚函数,则我们应该执行与构造函数或析构函数所属类型相对应的虚函数版本。
Base::foo() // 基类构造函数中调用的是 Base::foo()Base::foo() // 基类析构函数中调用的是 Base::foo()如果此时调用派生类的虚函数,可能会访问未初始化的派生类成员,导致未定义行为(UB)。在构造和析构期间,对象的类型是“不完整”的,虚函数的行为不同于运行时多态。如果此时调用派生类的虚函数,可能会访问已销毁的派生类成员,同样导致UB。在构造函数中,对象的动态类型是当前正在构造的类(尚未成为派生类)。当在构造函数或析构函数中调用虚函数时,
2025-06-22 17:22:31
315
原创 C++法则13:一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。
C++法则13:一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。C++法则13:一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。
2025-06-22 17:17:52
251
原创 C++法则12:右值引用的核心目的:支持移动语义(Move Semantics)
C++法则12:右值引用的核心目的:支持移动语义(Move Semantics)C++法则12:右值引用的核心目的:支持移动语义(Move Semantics)右值引用(Rvalue Reference)是C++11引入的最重要特性之一,其主要设计目的就是支持移动语义(Move Semantics)。
2025-06-22 17:07:51
259
原创 C++法则11:没有“顶层 const 引用“
C++法则11:没有“顶层 const 引用”C++法则11:没有“顶层 const 引用”。这个法则揭示了引用和const修饰符交互时的一个重要特性。
2025-06-22 16:59:26
239
原创 C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。
C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。在C++中,是一个已存在对象的别名。一旦引用被初始化绑定到一个对象,它就不能再被重新绑定到其他对象。这一特性是引用与指针(pointer)的主要区别之一。
2025-06-22 16:54:58
214
原创 C++法则9:相同类型的两个数组如果大小不同,是不同类型。
数组类型 = 元素类型 + 大小。不同大小的数组是不同类型,影响重载、模板和类型检查。理解此规则有助于避免错误(如数组越界)并编写更安全的代码。
2025-06-22 16:48:07
210
原创 C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。
(法则 8)并不是一个官方术语,但通常指与特殊成员函数(如拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符等)相关的规则。因此,默认的拷贝赋值运算符(尝试逐个成员赋值)无法正确修改引用成员所引用的目标。C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。如果允许默认的拷贝赋值,可能会导致意外的行为或违反引用的语义。这个规则是 C++ 对象模型的一部分,确保引用语义的正确性。引用的对象,而是修改。
2025-06-22 16:40:38
304
原创 C++法则7:如果一个类需要一个拷贝构造函数,几乎可以肯定它也需要一个拷贝赋值运算符。反之亦然——如果一个类需要一个拷贝赋值运算符,几乎 可以肯定它也需要一个拷 贝构造函数。
C++法则7:如果一个类需要一个拷贝构造函数,几乎可以肯定它也需要一个拷贝赋值运算符。反之亦然——如果一个类需要一个拷贝赋值运算符,几乎 可以肯定它也需要一个拷 贝构造函数。C++法则7:如果一个类需要一个拷贝构造函数,几乎可以肯定它也需要一个拷贝赋值运算符。反之亦然——如果一个类需要一个拷贝赋值运算符,几乎 可以肯定它也需要一个拷 贝构造函数。这条法则指出在C++中,拷贝构造函数和拷贝赋值运算符通常是成对出现的 - 如果一个类需要自定义其中一个,那么它几乎肯定也需要自定义另一个。
2025-06-22 16:35:20
132
原创 C++法则6: 如果一个类需要自定义析构函数,几乎可以肯定它也需要自定义拷贝赋值运算符和拷贝构造函数。
这条法则指出:如果一个类需要自定义析构函数,几乎可以肯定它也需要自定义拷贝赋值运算符和拷贝构造函数。这条法则源于资源管理的需要。当类需要自定义析构函数时,通常意味着它管理着某种资源(如动态内存、文件句柄、网络连接等)。在这种情况下,使用编译器生成的默认拷贝操作(拷贝构造函数和拷贝赋值运算符)可能会导致以下问题:浅拷贝问题:默认拷贝操作只是简单复制成员变量,可能导致多个对象共享同一资源双重释放:当这些对象被销毁时,同一资源会被多次释放内存泄漏:在拷贝赋值时可能丢失对原有资源的引用解决方案遵循三法则,
2025-06-22 16:32:30
234
原创 C++法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。
C++法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。C++法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。在 C++ 中,指的是:当函数参数是(即按值传递)时,传递给函数的实参会进行这意味着会调用拷贝构造函数(或移动构造函数,如果适用)来创建参数的副本。
2025-06-22 16:27:11
159
原创 C++法则4: 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。
第一个参数是自身类类型的引用必须是引用(通常为const引用,但非const引用也可以)。如果传值(而非引用),会导致无限递归,因为传值会调用拷贝构造函数自身。或MyClass&。额外参数有默认值可以有其他参数,但这些参数必须有默认值。如果没有其他参数,就是一个典型的拷贝构造函数;如果有额外参数,则称为带额外参数的拷贝构造函数(但本质上仍是拷贝构造函数)。函数名与类名相同作为构造函数,函数名必须与类名一致。
2025-06-22 16:24:18
121
原创 C++法则3:使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。
C++法则3:使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。C++法则3:使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。
2025-06-22 16:21:39
202
原创 C++法则2:对于一个调用,如果一个非函数模板与一个函数模板提供同样好的匹配,则选择非模板版本。
当存在一个非模板函数和一个函数模板都能提供同样好的匹配时,编译器会优先选择非模板版本。这个规则体现了C++对确定性和明确性的偏好。:指参数类型匹配程度相同(如完全匹配或需要相同的隐式转换):非模板函数 > 模板特化 > 模板生成的函数。:避免模板意外覆盖已有的精确匹配函数。
2025-06-22 16:16:25
186
原创 C++法则1:在 C++ 中,所有的具名变量都是左值,即使它们的类型是右值引用。
test(n)调用的是函数是:也就是说 0 是右值, n 是左值,现在假设我要把 n变为右值引用 ,让它调用test(T&& t)函数怎么做?方案1:方案2:以下方法是错误的:为什么?这是因为r1r2, 和r3本身都是,尽管它们被声明为右值引用(int&&
2025-06-22 16:12:19
141
原创 C++模拟Java C#的 finally
它通常用于释放资源(如文件句柄、数据库连接、锁等),避免内存泄漏或状态不一致。关键字,但可以通过以下几种方式实现类似的功能,确保资源释放或清理代码。_Finally时候非常有用,因为你在处理问题时可能遇到一个函数几百行。代码,有非常多的返回分支,如果不用_Finally,每个返回分支都可能。要小心加上恢复控制状态的代码, 例如,QTextEdit的键盘事件,在 Java 和 C# 中,QTreeWidget鼠标。)配合使用的关键字,
2025-04-26 15:48:27
206
原创 字符规则算法在文本处理的应用,很有意思。
编译器调用isAllRues时,先运行lambda表达式,而完成了lambda表达式之后,if语句中第二个参数bContainAnySpecial 也被设置了,还一个神奇的地方是,当查找到有特殊字符时,比如“●”,以前写了很多的功能函数,感觉写不完,可能用字符串匹配可以,但是我很少用,令天突然。现在我要判断按退格键时前面有没有文字,是不是都是特殊字符和空格,或者控制字符,
2025-04-25 02:01:36
340
原创 C++子类中写移动构造函数应该注意的地方。
从other中“窃取”资源(如指针、文件句柄等)。将other的状态置为有效但可析构的状态(例如将其指针设为nullptr释放当前对象的资源。从other中“窃取”资源。将other的状态置为有效但可析构的状态。noexcept移动操作通常不应抛出异常,这对标准库容器(如)的优化很重要。自己deepseek一下。
2025-04-22 01:41:16
414
原创 函数指针在C++遍历函数中的写法和应用(直接在函数中定义函数指针)。
现在重点来了,现在的每一种数据结构,都支持 for( auto& item: container),你可以把traverseMenu写成模板函数。例子,在Qt中,有一个右键菜单,我想把菜单中的节点改为章节。例子,在Qt中,有一个右键菜单,我想把菜单中的节点改为章节。
2025-03-30 15:18:27
273
原创 替代Qt中信号与槽时,不要忘记调用unsubscribe
也是正常的,为什么,因为do_resize没有用到对象 t 的作何成员或成员函数。例子3,当对象销毁时呢,正常吗?运行控制台不会输出任何东西。
2025-03-26 22:59:17
325
原创 接上一主题,直接对二进制进行加密,密钥不写入电脑。
钥的值,这有几十种可能,很容易破解,这就是电脑密码长度不能太少的原因。只有一个函数,还可以设计再好一点,加一个随机字符串中,,当密钥的长度等于1时,每个_byte都加上密。在随机字符中获得值,但思想都差不多。每一个Byte值都跟密钥相关联。
2025-03-23 18:06:45
160
原创 有关C++加密和自制简单加密程序。
c#版本写这篇文章缘由是很久以前,我用C#写了一个类似记事本的程序,如图:想写一个私密的东西,比如日记等等。后来C#换成了C++CLI,C++MFC,现在是QT,那时候我用了两种加密程序,一种是DES,一种是自己写的。现在就有了三个版本的加密程序,一个是C#,一个是C++ CLI, 一个是 C++。
2025-03-23 01:51:41
553
原创 替代Qt中信号与槽的完整例子。
注意,要用static本来这篇文章不想在,但在Qt设计中刚好遇到这个例子,下面说一下事情的由来:我在用QTestEdit中,想做一个格式刷,World一样的格式刷。
2025-03-19 22:32:57
526
原创 关于如何设计等价于Qt的信号与槽机制,新版的_FileManager
【代码】关于如何设计等价于Qt的信号与槽机制,新版的_FileManager。
2025-03-16 21:14:50
223
原创 接上一篇,C++中,如何设计等价于Qt的信号与槽机制。
看下面例子:所有连接类FileManage中的信号,在changeFileName函数中被调用。输出:输出:是不是一样,是不是很酷。:)
2025-03-16 15:31:56
481
原创 如何在C++中随心所欲地设计自己的事件?
以前用过VB、Delphi,C++Builder的老程序员都知道,事件驱动在可视化程序设计中有非常重要的位置,用起来非常方便,现在的Qt框架也是,不管是信号还是事件,或者Java中的接口,目的是让未来开发人员一起设计,一起扩展。为什么用pf_开头,看下图就知道了,如果一个不太熟悉Qt框架的人,要找信号和事件,每次都要去看源代码,几百个函数,烦死了。在my_window颜色发生改变时,要发出一个事件,表明color发生了改变,这里有三种方式。注意:上次说过第二种 Lambda 无法传递参数,使用起来不方便。
2025-03-14 21:58:47
321
原创 C++中,创建纳秒级的_DateTime
在创建类之前,我们首先要了解什么是时间,我说的是C++定义的时间 ,我们就把它看作路程即可,假设由A到B的路程是1公里。A - B (1公里)那么就是A点到B点的距离是1公里,同理:1994 - 1995 ( 1年)1994 和 1995就是相当于A和B,它叫时间点,A到B是一个路径段,1994-1995是时间段,为什么说这些,因为这涉及到C++ std::chrono库的两个类://时间段。
2025-03-10 22:33:13
770
原创 利用可变参数模板,可打印任意参数和参数值。(C++很好的调式函数)
是 C/C++ 宏定义中的一个特殊标识符,用于表示(Variadic Macros)中的参数包。它允许宏接受任意数量的参数。
2025-03-07 20:13:02
1043
原创 C++,巧用模板函数,给每一个类或容器编写一个遍历函数。
所以,不管你是什么类型的容器,字符串,数组,二叉树、、、最后不管三七二十一,都写一个遍历函数。我们在树中可能要查找一个key存不存在,可能要查询有几个一样的DisplayText,下面函数功能是统计有几个DisplayText是一样的节点,并把它放入一个列表中。有过经验的朋友都知道,我们写程序中可能要多次编写遍历函数,对于数组或集合没关系,在捕获列表中 liResult要加& 引用,否则不能修改liResult的值。可能要查找那个文本显示是红色的,等等。时,遍历马上结束,当然,你可以。
2025-02-28 02:35:54
244
原创 再再接上一主题,在C++,函数指针问题,如何使用std::function 和 std::bind?
在Qt中,_GuiTreeView封装了一个my_QTreeWidget,.Net中它封装了一个TreeView控件,其中。说明函数指针问题前,我想设计一个类(_GuiTreeView),它能在Qt、MFC、.Net环境中使用,我在_GuiTree的一个函数,然后我再在_GuiTree中的这个函数中设计一个接口(函数指针),让。现在问题来了,我在my_QTreeWidget中设计的一个菜单,当它点击一个添加按钮时,它会调用。现在,在my_QTreeWidget中,在my_QTreeWidget中。
2025-02-27 01:01:14
335
原创 C++中,关于用 size_t 还是用 int,永远要统一标准。
嗯,这个程序运行了几个月,甚至几年,有一天,其中有好几个应用用pkg_to_memory打包了好多数据,完全没问题。但是,后来为了兼容性,你改了程序,把int改为size_t:
2025-02-24 00:44:36
197
原创 接上一主题,在Qt中,用信号代替函数指针,最终目标都是能直接使用lambda表达式,效果一样。
上次说到,我想加一个QTextEdit放在 my_QWidget上,在不使用其它任何控件的情况上,让QTextEdit随窗体的大小改变而布满整个窗体,如何做。第三个方法是:使用Qt中的信号。最后附上代码,只加了两行语句。第二个方法是:使用函数指针。一个方法是:使用继承。
2025-02-22 14:19:50
388
原创 用C++写一个比python的print还方便的函数,支持任意数据类型。
在_p的实现中,所有内容都由_tostr函数完成,注意,像。这样的显示函数性能慢它几万倍也没关系,不要说十几倍。
2025-02-22 10:33:06
249
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人