自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(179)
  • 收藏
  • 关注

原创 C++法则22:运算符 ::* 和 ->* 和 ::* 是独特的整体运算符,是不可分的。

C++成员指针运算符::*、->*和.*是独特的整体运算符。::*用于声明指向类成员的指针(如int MyClass::*ptr = &MyClass::value),而->*和.*分别通过对象指针或对象本身访问这些成员。这些运算符不可拆分,优先级特殊,常用于回调等动态成员访问场景。使用时需注意它们与普通指针的区别,必须结合具体对象才能访问实际成员。

2025-07-31 19:14:56 279

原创 C++法则21:避免将#include放在命名空间内部。

摘要:C++编程中应避免将#include指令置于命名空间内部,应将其放在命名空间声明之前。这样做遵循代码惯例,提高可读性,防止意外将标准库内容引入自定义命名空间,避免名称冲突和维护困难。正确做法是在命名空间外部包含头文件,仅在极特殊情况下才考虑内部包含,并需详细说明。此规则有助于编写更清晰、更易维护的代码。

2025-07-12 23:37:13 454

原创 C++法则20:元编程是 C++ 中实现零开销抽象的核心工具之一,但并非所有抽象都能通过它实现零开销。

摘要: 元编程(模板、constexpr等)是C++实现零开销抽象的核心工具,通过编译时计算(类型推导、循环展开等)消除运行时开销,达到与手写代码相当的效率。其适用于编译时确定的场景(如std::tuple、编译期多态),但无法避免运行时动态行为(如虚函数、std::any)的固有开销。C++的哲学将性能与灵活性交由开发者选择:元编程优化静态逻辑,而动态需求需权衡性能。典型工具包括模板特化、if constexpr和CRTP,实践中如std::array(零开销)与std::vector(动态开销)的对比体

2025-06-28 17:21:31 539

原创 C++法则19:所有抽象都是零开销的,直到你需要它们无法提供的功能。

C++的零开销抽象法则指出,高级抽象不应带来性能损失,除非需要其无法提供的功能。如智能指针和迭代器在基础使用时与底层操作效率相当,但特殊功能(如共享指针的引用计数)会产生开销。这一设计理念体现了C++"不为未用功能付费"的核心原则,平衡了抽象便利与性能最优。模板元编程的编译时特性也遵循这一哲学,通过提前计算确保运行时零开销。

2025-06-28 17:16:43 183

原创 tuple C++ 模板元编程(Template Metaprogramming, TMP) 的经典应用。

C++标准库中的std::tuple通过递归模板继承实现高效数据存储,不使用运行时类型擦除(如std::any)。其核心特点是:1)编译时确定类型,确保类型安全;2)直接存储元素,无动态分配开销;3)通过模板元编程实现高效访问(如std::get<I>)。实现上采用递归继承结构,每个元素存储在继承链的不同层级,get操作通过模板特化进行编译时解析。相比std::any,tuple在性能和类型安全方面更具优势,是学习C++模板元编程的经典案例。

2025-06-28 01:29:58 331

原创 C++ 法测18:热爱才是最大的优势。

摘要:热爱编程才是程序员最大的优势。顶尖程序员也会频繁查文档、写"烂代码",关键在于理解原理而非死记语法。实际解决问题的能力比熟记理论更重要(如解决100道LeetCode题优于背《算法导论》)。记忆力和完美代码并非必需,重构能力和系统思考才是关键。正如Linus Torvalds所说,保持热爱才是最重要的,在编程世界里人人平等。(150字)

2025-06-26 00:52:32 110

原创 C++法则17:当定义函数模板的特例化版本时,我们本质上是接管了编译器的工作。

C++模板特例化允许开发者针对特定类型提供优化实现,接管编译器生成代码的工作。特例化的主要作用包括性能优化、特殊类型处理、边界条件应对和增强类型安全。通过显式特例化,开发者可以完全替换特定参数组合的原始模板实现,而非简单重载。使用时需确保特例化版本与原模板接口完全匹配,适用于需要优化特定类型性能、处理特殊语义或边界情况的场景。特例化赋予开发者对模板实例化的精确控制权,但也要求确保实现的正确性。

2025-06-25 21:54:11 664

原创 C++法则16:当分配一个对象时,尽量NewEmplace代替 new。

C++法则摘要:建议使用NewEmplace替代new来分配对象,可避免不必要的初始化操作。NewEmplace模板函数直接构造对象并返回指针,相比传统new减少了初始化次数。同时强调了new/delete配对使用原则,以及与malloc/free的区别。

2025-06-25 00:46:05 559

原创 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 332

原创 C++可打印任何参数,改进版(支持括号,字符串嵌套)

本文介绍了_pns宏在解析常量字符串参数时出现的bug及解决方案。原版本在处理包含引号、转义字符或括号嵌套的参数时存在缺陷,无法正确分割参数列表。改进后的parseNames函数通过跟踪括号嵌套深度、引号状态和转义字符,能正确处理复杂场景如f("123,456")和嵌套调用f(getvalue<string>("123,456"))。该函数支持C++14和C++17两种实现,采用递归或折叠表达式处理可变参数,并通过_tostr函数实现各种类型到字符串的转换

2025-06-24 13:00:00 333

原创 保存 QTextEdit 内容打包成一个文件(包含文本和图片)

该代码实现了一个功能丰富的Qt文本编辑器控件(my_QTextEdit),主要特性包括: 富文本处理功能 支持图文混排内容的序列化(f_packageToByteArray)与反序列化(f_splitFromByteArray) 可保存/恢复包含图片资源的完整文档 智能编辑功能 自动序号识别与格式设置 章节标题智能识别与样式应用 特殊符号处理 缩进/反缩进操作 高级特性 代码语法高亮(支持C++/Python/Java等多种语言) 右键菜单集成AI功能(DeepSeek解释、百度搜索等) 文本转语音功能 U

2025-06-23 17:27:25 167

原创 C++法则14:如果构造函数或析构函数调用了某个虚函数,则我们应该执行与构造函数或析构函数所属类型相对应的虚函数版本。

Base::foo() // 基类构造函数中调用的是 Base::foo()Base::foo() // 基类析构函数中调用的是 Base::foo()如果此时调用派生类的虚函数,可能会访问未初始化的派生类成员,导致未定义行为(UB)。在构造和析构期间,对象的类型是“不完整”的,虚函数的行为不同于运行时多态。如果此时调用派生类的虚函数,可能会访问已销毁的派生类成员,同样导致UB。在构造函数中,对象的动态类型是当前正在构造的类(尚未成为派生类)。当在构造函数或析构函数中调用虚函数时,

2025-06-22 17:22:31 341

原创 C++法则13:一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。

C++法则13:一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。C++法则13:一个派生类的函数如果覆盖了某个继承而来的虚函数,则它的形参类型必须与被它覆盖的基类函数完全一致。

2025-06-22 17:17:52 281

原创 C++法则12:右值引用的核心目的:支持移动语义(Move Semantics)

C++法则12:右值引用的核心目的:支持移动语义(Move Semantics)C++法则12:右值引用的核心目的:支持移动语义(Move Semantics)右值引用(Rvalue Reference)是C++11引入的最重要特性之一,其主要设计目的就是支持移动语义(Move Semantics)。

2025-06-22 17:07:51 287

原创 C++法则11:没有“顶层 const 引用“

C++法则11:没有“顶层 const 引用”C++法则11:没有“顶层 const 引用”。这个法则揭示了引用和const修饰符交互时的一个重要特性。

2025-06-22 16:59:26 255

原创 C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。

C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。C++法则10:引用本身是一个“别名”(alias),一旦绑定到一个对象后,就不能再重新绑定到其他对象。在C++中,是一个已存在对象的别名。一旦引用被初始化绑定到一个对象,它就不能再被重新绑定到其他对象。这一特性是引用与指针(pointer)的主要区别之一。

2025-06-22 16:54:58 246

原创 C++法则9:相同类型的两个数组如果大小不同,是不同类型。

数组类型 = 元素类型 + 大小。不同大小的数组是不同类型,影响重载、模板和类型检查。理解此规则有助于避免错误(如数组越界)并编写更安全的代码。

2025-06-22 16:48:07 228

原创 C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。

(法则 8)并不是一个官方术语,但通常指与特殊成员函数(如拷贝构造函数、拷贝赋值运算符、移动构造函数、移动赋值运算符等)相关的规则。因此,默认的拷贝赋值运算符(尝试逐个成员赋值)无法正确修改引用成员所引用的目标。C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。C++法则8:对于有引用成员的类,合成拷贝赋值运算符被定义为删除的。如果允许默认的拷贝赋值,可能会导致意外的行为或违反引用的语义。这个规则是 C++ 对象模型的一部分,确保引用语义的正确性。引用的对象,而是修改。

2025-06-22 16:40:38 335

原创 C++法则7:如果一个类需要一个拷贝构造函数,几乎可以肯定它也需要一个拷贝赋值运算符。反之亦然——如果一个类需要一个拷贝赋值运算符,几乎 可以肯定它也需要一个拷 贝构造函数。

C++法则7:如果一个类需要一个拷贝构造函数,几乎可以肯定它也需要一个拷贝赋值运算符。反之亦然——如果一个类需要一个拷贝赋值运算符,几乎 可以肯定它也需要一个拷 贝构造函数。C++法则7:如果一个类需要一个拷贝构造函数,几乎可以肯定它也需要一个拷贝赋值运算符。反之亦然——如果一个类需要一个拷贝赋值运算符,几乎 可以肯定它也需要一个拷 贝构造函数。这条法则指出在C++中,拷贝构造函数和拷贝赋值运算符通常是成对出现的 - 如果一个类需要自定义其中一个,那么它几乎肯定也需要自定义另一个。

2025-06-22 16:35:20 140

原创 C++法则6: 如果一个类需要自定义析构函数,几乎可以肯定它也需要自定义拷贝赋值运算符和拷贝构造函数。

这条法则指出:如果一个类需要自定义析构函数,几乎可以肯定它也需要自定义拷贝赋值运算符和拷贝构造函数。这条法则源于资源管理的需要。当类需要自定义析构函数时,通常意味着它管理着某种资源(如动态内存、文件句柄、网络连接等)。在这种情况下,使用编译器生成的默认拷贝操作(拷贝构造函数和拷贝赋值运算符)可能会导致以下问题:浅拷贝问题:默认拷贝操作只是简单复制成员变量,可能导致多个对象共享同一资源双重释放:当这些对象被销毁时,同一资源会被多次释放内存泄漏:在拷贝赋值时可能丢失对原有资源的引用解决方案遵循三法则,

2025-06-22 16:32:30 246

原创 C++法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。

C++法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。C++法则5: 在函数调用过程中,具有非引用类型的参数要进行拷贝初始化。在 C++ 中,指的是:当函数参数是(即按值传递)时,传递给函数的实参会进行这意味着会调用拷贝构造函数(或移动构造函数,如果适用)来创建参数的副本。

2025-06-22 16:27:11 175

原创 C++法则4: 如果一个构造函数的第一个参数是自身类类型的引用,且任何额外参数都有默认值,则此构造函数是拷贝构造函数。

第一个参数是自身类类型的引用必须是引用(通常为const引用,但非const引用也可以)。如果传值(而非引用),会导致无限递归,因为传值会调用拷贝构造函数自身。或MyClass&。额外参数有默认值可以有其他参数,但这些参数必须有默认值。如果没有其他参数,就是一个典型的拷贝构造函数;如果有额外参数,则称为带额外参数的拷贝构造函数(但本质上仍是拷贝构造函数)。函数名与类名相同作为构造函数,函数名必须与类名一致。

2025-06-22 16:24:18 128

原创 C++法则3:使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。

C++法则3:使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。C++法则3:使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自赋值。

2025-06-22 16:21:39 231

原创 C++法则2:对于一个调用,如果一个非函数模板与一个函数模板提供同样好的匹配,则选择非模板版本。

当存在一个非模板函数和一个函数模板都能提供同样好的匹配时,编译器会优先选择非模板版本。这个规则体现了C++对确定性和明确性的偏好。:指参数类型匹配程度相同(如完全匹配或需要相同的隐式转换):非模板函数 > 模板特化 > 模板生成的函数。:避免模板意外覆盖已有的精确匹配函数。

2025-06-22 16:16:25 203

原创 C++法则1:在 C++ 中,所有的具名变量都是左值,即使它们的类型是右值引用。

test(n)调用的是函数是:也就是说 0 是右值, n 是左值,现在假设我要把 n变为右值引用 ,让它调用test(T&& t)函数怎么做?方案1:方案2:以下方法是错误的:为什么?这是因为r1r2, 和r3本身都是,尽管它们被声明为右值引用(int&&

2025-06-22 16:12:19 159

原创 C++模拟Java C#的 finally

它通常用于释放资源(如文件句柄、数据库连接、锁等),避免内存泄漏或状态不一致。关键字,但可以通过以下几种方式实现类似的功能,确保资源释放或清理代码。_Finally时候非常有用,因为你在处理问题时可能遇到一个函数几百行。代码,有非常多的返回分支,如果不用_Finally,每个返回分支都可能。要小心加上恢复控制状态的代码, 例如,QTextEdit的键盘事件,在 Java 和 C# 中,QTreeWidget鼠标。)配合使用的关键字,

2025-04-26 15:48:27 241

原创 字符规则算法在文本处理的应用,很有意思。

编译器调用isAllRues时,先运行lambda表达式,而完成了lambda表达式之后,if语句中第二个参数bContainAnySpecial 也被设置了,还一个神奇的地方是,当查找到有特殊字符时,比如“●”,以前写了很多的功能函数,感觉写不完,可能用字符串匹配可以,但是我很少用,令天突然。现在我要判断按退格键时前面有没有文字,是不是都是特殊字符和空格,或者控制字符,

2025-04-25 02:01:36 351

原创 C++子类中写移动构造函数应该注意的地方。

从other中“窃取”资源(如指针、文件句柄等)。将other的状态置为有效但可析构的状态(例如将其指针设为nullptr释放当前对象的资源。从other中“窃取”资源。将other的状态置为有效但可析构的状态。noexcept移动操作通常不应抛出异常,这对标准库容器(如)的优化很重要。自己deepseek一下。

2025-04-22 01:41:16 431

原创 函数指针在C++遍历函数中的写法和应用(直接在函数中定义函数指针)。

现在重点来了,现在的每一种数据结构,都支持 for( auto& item: container),你可以把traverseMenu写成模板函数。例子,在Qt中,有一个右键菜单,我想把菜单中的节点改为章节。例子,在Qt中,有一个右键菜单,我想把菜单中的节点改为章节。

2025-03-30 15:18:27 280

原创 替代Qt中信号与槽时,不要忘记调用unsubscribe

也是正常的,为什么,因为do_resize没有用到对象 t 的作何成员或成员函数。例子3,当对象销毁时呢,正常吗?运行控制台不会输出任何东西。

2025-03-26 22:59:17 331

原创 接上一主题,直接对二进制进行加密,密钥不写入电脑。

钥的值,这有几十种可能,很容易破解,这就是电脑密码长度不能太少的原因。只有一个函数,还可以设计再好一点,加一个随机字符串中,,当密钥的长度等于1时,每个_byte都加上密。在随机字符中获得值,但思想都差不多。每一个Byte值都跟密钥相关联。

2025-03-23 18:06:45 171

原创 有关C++加密和自制简单加密程序。

c#版本写这篇文章缘由是很久以前,我用C#写了一个类似记事本的程序,如图:想写一个私密的东西,比如日记等等。后来C#换成了C++CLI,C++MFC,现在是QT,那时候我用了两种加密程序,一种是DES,一种是自己写的。现在就有了三个版本的加密程序,一个是C#,一个是C++ CLI, 一个是 C++。

2025-03-23 01:51:41 587

原创 替代Qt中信号与槽的完整例子。

注意,要用static本来这篇文章不想在,但在Qt设计中刚好遇到这个例子,下面说一下事情的由来:我在用QTestEdit中,想做一个格式刷,World一样的格式刷。

2025-03-19 22:32:57 544

原创 关于如何设计等价于Qt的信号与槽机制,新版的_FileManager

【代码】关于如何设计等价于Qt的信号与槽机制,新版的_FileManager。

2025-03-16 21:14:50 231

原创 接上一篇,C++中,如何设计等价于Qt的信号与槽机制。

看下面例子:所有连接类FileManage中的信号,在changeFileName函数中被调用。输出:输出:是不是一样,是不是很酷。:)

2025-03-16 15:31:56 496

原创 如何在C++中随心所欲地设计自己的事件?

以前用过VB、Delphi,C++Builder的老程序员都知道,事件驱动在可视化程序设计中有非常重要的位置,用起来非常方便,现在的Qt框架也是,不管是信号还是事件,或者Java中的接口,目的是让未来开发人员一起设计,一起扩展。为什么用pf_开头,看下图就知道了,如果一个不太熟悉Qt框架的人,要找信号和事件,每次都要去看源代码,几百个函数,烦死了。在my_window颜色发生改变时,要发出一个事件,表明color发生了改变,这里有三种方式。注意:上次说过第二种 Lambda 无法传递参数,使用起来不方便。

2025-03-14 21:58:47 328

原创 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 814

原创 利用可变参数模板,可打印任意参数和参数值。(C++很好的调式函数)

是 C/C++ 宏定义中的一个特殊标识符,用于表示(Variadic Macros)中的参数包。它允许宏接受任意数量的参数。

2025-03-07 20:13:02 1059

原创 Qt控件中函数指针使用的最终版本,使用std::function

结论,很方便,甚至都不用Qt的信号与槽机制。

2025-03-01 22:14:01 328

原创 C++,巧用模板函数,给每一个类或容器编写一个遍历函数。

所以,不管你是什么类型的容器,字符串,数组,二叉树、、、最后不管三七二十一,都写一个遍历函数。我们在树中可能要查找一个key存不存在,可能要查询有几个一样的DisplayText,下面函数功能是统计有几个DisplayText是一样的节点,并把它放入一个列表中。有过经验的朋友都知道,我们写程序中可能要多次编写遍历函数,对于数组或集合没关系,在捕获列表中 liResult要加& 引用,否则不能修改liResult的值。可能要查找那个文本显示是红色的,等等。时,遍历马上结束,当然,你可以。

2025-02-28 02:35:54 256

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除