- 博客(67)
- 收藏
- 关注
原创 多线程中,什么是condition_variable?
摘要:condition_variable是用于线程同步的工具,让线程在条件不满足时休眠,条件满足时被唤醒。它不保护数据,只管理线程的等待/唤醒机制。使用时必须配合mutex和条件判断,核心操作包括wait、notify_one和notify_all。关键要点:1) 必须使用while循环或predicate检查条件,防止虚假唤醒;2) 条件状态由程序员维护;3) notify只是提醒检查条件,不保证条件成立。典型用法示例展示了如何正确实现线程间的条件等待和通知机制。
2025-12-20 22:26:56
397
原创 为什么线程阻塞要用.join而不是.wait
文章摘要:join()方法源自Fork-Join并发模型,其核心是执行流的"合并"而非单纯"等待"。主线程调用join()表示要与子线程重新合并为一条执行流,等待是合并的自然结果。与wait()不同,join()专门用于线程终结时的资源回收,语义更明确。该术语源于1963年Melvin Conway提出的并行计算概念,detach()代表永久分离,而join()体现最终汇合。这种设计准确反映了线程生命周期的合并逻辑。
2025-12-20 21:08:13
141
原创 前端与移动开发之 CSS vs QSS
摘要: CSS(层叠样式表)用于网页设计,通过选择器控制HTML元素的外观(颜色、字体、布局等),支持层叠与动画效果。QSS(Qt样式表)语法类似CSS,但专用于Qt控件美化,可调整按钮、文本框等组件的颜色、边框和交互状态,通过.qss文件或代码直接应用。两者均支持伪类(如悬停效果),但CSS作用于网页,QSS仅影响Qt应用程序界面。示例展示了如何用CSS和QSS分别实现绿色按钮的悬停变色效果,体现语法相似性及应用场景差异。
2025-10-27 23:46:44
465
原创 为什么 QStringLiteral 比普通字符串写法更高效 | QString 在 Qt 内部的构造机制与内存优化
本文对比了Qt中两种字符串创建方式的区别:普通QString构造和QStringLiteral宏。普通写法会在运行时执行编码转换、堆内存分配和数据拷贝,而QStringLiteral在编译时将字符串转为UTF-16常量存储在只读段,避免了运行时开销。性能测试显示后者在循环等场景下显著降低CPU和内存消耗。Qt官方推荐对固定文本使用QStringLiteral以获得最佳性能,特别适合嵌入式或高频调用场景。
2025-10-27 22:20:51
525
原创 什么是前端、后端与全栈开发,Qt属于什么?
本文介绍了软件开发的三个主要方向:前端、后端和全栈。前端负责用户界面展示和交互,使用HTML/CSS/JavaScript等技术实现设计稿;后端处理业务逻辑、数据管理和接口提供,常用Python/Java等语言;全栈开发者则兼具前后端能力。文章还特别说明了Qt框架既可以用于前端界面开发,也能通过数据库模块实现后端功能。三者各司其职又相互配合,共同构成完整的应用系统。
2025-10-19 16:11:41
536
原创 [Qt] 什么是qmake与cmake
CMake是一个跨平台的构建系统工具,用于生成不同平台的本地构建文件(如Makefile、VS工程等),但不直接编译代码。qmake是Qt专用的构建工具,自动处理Qt特有的编译步骤。CMake适用范围更广,扩展性强,已成为现代C++项目的主流选择,Qt6也推荐使用CMake。两者与编译器的关系是:CMake/qmake生成构建规则,make执行编译,编译器完成实际编译工作。Qt Creator可自动生成qmake工程文件,而CMake需手动配置CMakeLists.txt。一个简单的Qt CMake项目需指
2025-10-17 19:53:55
1079
原创 【github扫盲】Dashboard、Repositories、Issues、Pull Requests
GitHub常见功能及术语中英对照表 GitHub常用功能与中文博客概念对应关系
2025-10-12 18:28:19
799
原创 什么是 Qt 的元对象系统?
Qt的元对象系统是其核心特性之一,在标准C++基础上扩展了运行时反射能力。通过Q_OBJECT宏和moc工具,系统会为类生成元数据(QMetaObject),包含类名、属性、信号槽等信息。运行时可通过metaObject()访问这些数据,支持动态属性查询、类信息获取等功能。元对象系统还实现了信号槽机制的基础,支持跨线程通信。此外,系统允许动态添加未声明的属性。这一机制使Qt在保持C++性能的同时,获得了类似动态语言的灵活性。
2025-10-12 17:43:58
343
原创 Qt有哪些信号槽可以在 Designer 中直接连接,哪些必须通过代码实现?附完整代码
本文介绍了在Qt开发中通过信号与槽机制实现控件交互的方法。以QCheckBox控制QPlainTextEdit字体加粗为例,分析了Qt Designer的局限性:只能连接控件已有的标准槽函数,无法直接实现自定义功能。文章详细展示了通过代码实现的步骤:1)声明自定义槽函数;2)实现字体设置逻辑;3)手动连接信号与槽。提供了完整的代码示例,包括界面初始化、信号槽连接和具体功能实现(字体加粗、斜体、颜色设置等)。该案例演示了当Designer无法满足需求时,如何通过代码实现更复杂的控件交互功能。
2025-10-11 21:08:28
757
原创 Qt中的字符串宏 | 编译期检查和运行期检查 | Qt信号与槽connect写法
文章摘要:字符串宏是C/C++中通过预处理器进行文本替换的机制,字符串宏展开后生成字符串字面量。Qt早期版本使用SIGNAL()/SLOT()宏实现信号槽连接,这种基于字符串匹配的方式存在运行时才能发现错误的弊端。Qt5+推荐使用函数指针的新式connect语法,通过编译期检查确保信号槽的正确性。编译期检查在编译阶段发现问题,比运行期检查更安全高效,能避免拼写错误和类型不匹配等问题。新式语法利用了C++的类型系统,在编译时就能验证信号和槽的存在及匹配性。
2025-10-11 18:33:37
1262
原创 为什么Qt中的字符串类型为QString而不采用std::string?
QString 是 Qt 自己定义的字符串类,用来代替标准库中的 std::string,它位于 <QString> 头文件中。
2025-10-11 18:14:43
172
原创 Qt 为什么控件要用指针创建?
Qt控件使用指针主要有三个原因:1.便于父子对象管理内存,父对象析构时会自动删除子控件;2.支持动态创建和布局管理,普通对象在构造函数结束后会被销毁;3.确保成员函数能持续访问控件状态。指针形式能保持控件生命周期与程序运行周期一致,避免内存泄漏和悬空指针问题。
2025-10-10 19:59:22
359
原创 Linux 基本命令超详细解释第四期 | vi | su | exit | sudo
su是的缩写,用于在终端中切换用户身份。最常见的用途是切换到root 用户,以执行系统管理任务exit用于退出当前 shell 环境或终止用户登录,当你使用su或远程登录后,可以用它返回上一级会话sudo(superuser do)允许普通用户以root 权限执行命令,它比su更安全,因为:只在当前命令中临时获得权限;不需要知道 root 密码;所有操作都有日志记录。
2025-10-10 19:52:43
471
原创 Linux 终端常用快捷键整理
本文汇总了Linux命令行常用快捷键,分为五类功能:光标移动(如Ctrl+A行首、Ctrl+E行尾)、文本编辑(如Ctrl+U删前行、Ctrl+K删后行)、历史命令(Ctrl+R反向搜索、!!重执上条)、控制操作(Ctrl+C终止、Ctrl+L清屏)和其他功能(Tab补全、Alt+U转大写)。这些快捷键可显著提升终端操作效率,覆盖命令输入、修改、检索等常见场景。
2025-09-19 23:01:29
1320
原创 Linux 基本命令超详细解释第二期 | touch | cat | more | cp | mv | rm | which | find
文件扩展名在 Linux 里并不是强制要求,Linux 判断文件类型主要看内容(比如用。find 用于 在目录下查找文件或目录,可按名字、类型、时间、大小等条件搜索。用于查看文件内容、合并文件,或通过重定向创建文件。如果文件名是简单的字母、数字,没有空格或特殊字符,指定的目录里寻找这个可执行文件,然后运行它。创建文件并输入内容(Ctrl+D 结束输入)用于创建空文件,或修改文件的时间戳。👉 不提示、递归删除目录,非常危险。,用于移动或重命名文件/目录。的文件(支持通配符,比如。合并多个文件,并写入新文件。
2025-09-19 22:55:42
1059
原创 linux中为什么 rm 命令能删除自己 | linux使用rm命令删自己会怎样?
文章探讨了在Linux系统中用rm命令删除自身时会发生什么。rm作为/bin/rm的可执行文件,运行时会被加载到内存形成独立进程。删除磁盘上的rm文件不会影响已在运行的进程,但后续新终端将因找不到该命令而报错。这展示了Linux程序执行与磁盘文件的分离特性:程序加载到内存后就拥有独立副本,原文件删除不影响已运行进程。
2025-09-19 22:32:40
396
原创 Linux 基本命令超详细解释第一期 | cd | pwd | ls | mkdir | rmdir
本文介绍了Linux系统常用的目录操作命令: cd:切换目录,支持主目录(~)、上一目录(-)、上级目录(..)等操作 pwd:显示当前目录路径,分逻辑路径(-L)和物理路径(-P) ls:列出目录内容,常用参数-l(详情)、-a(隐藏文件)、-h(友好大小) mkdir:创建目录,支持多级创建(-p)、权限设置(-m)和过程显示(-v) rmdir:删除空目录,递归删除需加-p参数 注意事项包括: cd是shell内置命令 删除非空目录需用rm -r 目录权限用数字表示(如755) 使用符号链接时注意逻辑
2025-09-14 22:56:32
821
原创 MySQL 主键详解:作用与使用方法
MySQL主键是数据库表设计的核心元素,具有多重关键作用。作为唯一标识,主键确保每行数据不可重复且非空(如id INT PRIMARY KEY)。它维护数据完整性,防止重复记录;作为外键关联基础,实现表间关系;同时通过自动创建聚簇索引显著提升查询效率(如SELECT * FROM users WHERE id=2)。主键使用方式多样:可在建表时定义、后期添加,支持复合主键(多列组合)、自增主键(AUTO_INCREMENT)等。合理运用主键能有效优化数据库结构与查询性能。
2025-08-15 20:27:15
696
原创 为什么C++主函数 main 要写成 int 返回值 | main(int argc, char* argv[]) 这种写法是什么意思?
本文解答了C++中main函数的两个常见问题:1) main函数必须返回int类型值,这是为了向操作系统报告程序执行状态(0表示成功,非0表示错误);2) 带参数的main(int argc, char* argv[])形式通过命令行参数接收数据,这些参数由操作系统在程序启动前解析并传入,因此不需要使用cin。文章还演示了如何在不同开发环境中配置命令行参数。
2025-08-12 21:23:02
1089
原创 C++ vector 扩容时到底发生了什么?
本文深入解析C++中std::vector的扩容机制。vector通过动态分配连续内存实现自动扩容,当push_back()时若空间不足,会申请新内存(通常2倍扩容),将旧元素整体搬迁后释放原内存。这种"整体搬家"操作成本较高,特别是元素多或类型复杂时。为优化性能,建议:1)为自定义类实现noexcept移动构造函数;2)提前使用reserve()预分配空间,减少扩容次数。理解这些底层机制有助于编写高效代码。
2025-08-07 23:41:33
468
原创 C++默认构造函数 ()= default 和 (){} 有什么区别
一个类/结构体是“聚合类型”,必须满足以下所有条件(C++14):没有用户提供的构造函数(包括也算“用户提供”)所有非静态成员都是 public没有虚函数没有基类没有默认成员初始化器(C++17之前)写了就会失去聚合性但不会,它仍然符合“没有用户提供的构造函数”的条件。POD 类型 = 满足下面两个条件的类:是trivial 类型是standard-layout 类型struct A {int x;int y;// ✅ 聚合 ✅ POD(默认构造 trivial 且没有特殊行为)
2025-08-06 15:46:43
1167
原创 C++ 变量初始化方式总结 | 拷贝初始化 | 列表初始化 | 值初始化
C++初始化方式总结:拷贝初始化(int a=1)最常见但可能有隐式转换风险;直接初始化(int a(1))更高效;列表初始化(int a{10})最安全,能防止窄化转换并支持容器初始化。列表初始化优先调用initializer_list构造函数,要求类模板提供对应实现。值初始化(int a{})确保变量初始化为零值,避免未定义行为。explicit构造函数禁止隐式转换,只能使用直接或列表初始化。
2025-08-05 23:32:14
716
原创 C++ 拷贝赋值、swap 与 noexcept 深度解析:高效实现 operator=
本文介绍了C++中实现安全高效的赋值运算符的方法。通过分析传统实现方式的缺点(重复代码、性能不高),推荐采用现代"Copy-and-Swap"技巧:通过值传递参数自动处理自赋值问题,利用swap函数完成资源交换,配合noexcept优化性能。该方法不仅简化了代码,还提高了异常安全性,并能与移动构造函数协同工作。文中还对比了std::copy与for循环的优劣,并展示了包含拷贝构造、移动构造和析构函数的完整MyArray类实现,为自定义类资源管理提供了现代化解决方案。
2025-08-05 22:51:22
482
原创 C++ 中 NULL 与 nullptr 有什么区别?
C++中NULL与nullptr的根本区别在于类型和安全性。NULL本质是整数0(int类型),在重载和模板中可能被误认为整数而非指针,导致意外行为;而nullptr是C++11引入的关键字(std::nullptr_t类型),专为空指针设计,智能转换为任意指针类型。典型场景中,NULL会错误匹配int重载(foo(NULL)调用foo(int)),而nullptr能正确调用指针版本(foo(nullptr)调用foo(char*))。在模板编程时,NULL推导为int,nullptr保持指针类型。因此,现
2025-07-30 22:05:07
516
1
原创 【C++基础】为什么两个字符串字面量看起来相同,却地址不同?
摘要:文章解释了C++中字符串常量的地址比较问题。关键在于区分指针变量地址和其指向的字符串地址。当使用&str时输出的是指针变量本身的地址,而非字符串地址。正确的比较方法应使用static_cast<const void*>(str)来查看字符串的实际地址。编译器通常会对相同字符串字面量进行合并优化,使其指向同一内存地址,但这种优化并非强制要求。文章还指出重新赋值会导致指针指向不同地址,并给出了验证字符串地址是否相同的正确代码示例。
2025-07-28 18:15:52
387
原创 【C++基础】为什么 char* 输出是字符串,而 int* 输出是地址?
同样是指针,为什么int*输出的是地址,而char*输出的是字符串内容?这和 C++ 标准库中对的重载实现密切相关。本文将从语义、函数重载、底层行为等方面详细解释这个问题。
2025-07-28 18:08:23
392
原创 【简述】C++11/14/17/20/23 中的关键新特性
C++11到C++23的演进展示了现代C++的关键改进。C++11引入auto、智能指针和移动语义等特性,奠定了现代C++基础。C++14增强类型推导和Lambda表达式。C++17新增结构化绑定、编译期if等实用功能。C++20带来概念、协程、范围等重大突破。C++23则进一步优化错误处理和编译时计算。这些改进使C++从手动内存管理发展为更安全高效的语言,提供了更优雅的语法、更强的性能控制和更安全的工程实践方式,标志着现代C++时代的到来。
2025-07-26 23:20:37
475
原创 【C++基础】引用 vs 指针:一次彻底弄懂它们的区别与联系
引用和指针是C++中两种重要的间接访问机制。引用是变量的别名,必须初始化且不可更改绑定;指针存储变量地址,可修改指向。引用语法更简洁安全,不能为null或重绑定;指针更灵活但风险高,支持空值、重定向和算术运算。引用常用于函数参数传递和运算符重载,指针适用于动态内存管理和数据结构构建。建议优先使用引用传递参数,必要时使用智能指针管理动态内存,避免裸指针和悬空引用。
2025-07-26 23:11:51
481
原创 【C++基础】指针常量 | 常量指针 | int* p | const int* p | int* const p| const int* const p
C++中const修饰指针存在四种组合形式:普通指针可修改值和地址;指向常量的指针(const在左边)允许修改指向但禁止改值;常量指针(const在右边)固定指向但允许改值;指向常量的常量指针则完全不可修改。关键在于const的位置:左侧修饰值,右侧修饰指针本身。实际应用中,const指针常用于函数参数保护数据(防止意外修改)或固定资源地址(避免指向变更)。理解这些差异有助于编写更安全、可靠的代码。
2025-07-26 23:02:22
345
原创 C++ 模板详解 | 函数模板 | 类模板 | 模板编译原理 | 模板元编程
摘要:C++模板是泛型编程的核心,允许编写与类型无关的通用代码。模板分为函数模板和类模板,通过编译期展开为具体类型生成代码,实现类型安全和高效执行。模板特化(全特化/偏特化)可为特定类型定制实现,非类型模板参数支持编译期常量。STL容器和算法广泛应用模板实现泛型设计。模板元编程利用编译期计算优化性能,但可能增加编译时间。正确使用模板需注意定义位置、参数匹配规则和类型推导特性。
2025-07-24 00:30:22
1740
原创 【C++面试】拷贝构造函数为什么要用引用?如果用指针或者值传递会怎样?
拷贝构造函数必须使用引用Person(const Person& p)的原因:1. 避免无限递归(按值传递Person(Person p)会导致构造时又需要调用拷贝构造)2. 提高效率(引用避免对象复制开销)3. 传指针Person(const Person* p)不是拷贝构造函数,不会被编译器自动调用。标准拷贝构造函数通过const引用既能安全复制对象,又能防止修改原对象,是唯一合法的拷贝构造签名形式。
2025-07-22 17:56:29
290
原创 引用 (int&) 与指针 (int*) 传递孰优孰劣?| C++
C++中引用与指针的对比分析:两者都能修改函数外部的变量值,但特性不同。引用语法简洁(直接使用变量名),且不能为null,适合必须修改且参数必填的场景;指针需要解引用(*操作符),但更灵活(可设为nullptr),适合可选参数或复杂数据结构。实际开发中,图像处理等确定性操作推荐引用,而回调函数等可选场景建议用指针。两者性能相当,选择取决于语义需求而非效率。
2025-07-22 00:31:39
1122
原创 深入理解 C++ 中的指针与自增表达式:*a++、(*a)++ 和 *++a 的区别解析
本文解析指针运算中常见的三种表达式区别:1) *a++先取指针当前值后移动指针;2) (*a)++对指针指向的值自增,指针不变;3) *++a先移动指针再取值。通过示例代码演示了不同操作对指针位置和数值的影响,强调运算符优先级和执行顺序对结果的关键作用。完整示例展示了连续执行这些表达式时指针和数值的变化过程。
2025-07-22 00:07:14
677
原创 C++ 智能指针 std::shared_ptr 指南:小白也能懂!
本文介绍了C++11引入的shared_ptr智能指针,它能自动管理内存释放,避免手动delete导致的内存泄漏、野指针等问题。shared_ptr采用引用计数机制,当计数为0时自动释放资源。文章通过示例展示了shared_ptr的基本用法,并指出循环引用会导致内存泄漏的问题。最后介绍了weak_ptr作为解决方案,它是一种不增加引用计数的弱引用,可以打破循环引用。weak_ptr需要通过lock()方法获取临时shared_ptr来访问对象。智能指针的使用大大简化了C++内存管理,让开发者更专注于业务逻辑
2025-07-20 16:15:00
347
原创 C++ 多线程中成员函数如何传参?拷贝、引用还是指针?
本文探讨了C++多线程编程中调用类成员函数的正确方式。通过示例类A演示了三种传参方法:直接传对象(产生副本)、传指针或引用(操作原对象)。关键点在于成员函数调用需要this指针,因此线程中必须提供对象实例。最佳实践是传指针或引用,确保操作原对象;若类禁止拷贝,则必须使用指针或引用。静态成员函数可直接调用,不需要对象。理解this指针机制(编译器将成员函数转换为带隐藏参数的普通函数)是掌握多线程成员函数调用的核心。
2025-07-20 16:02:32
858
原创 佩奇的数学问题 | [PTA] | 求个、十、百位
摘要:本文介绍了一种特殊的数学运算符号[×],其运算方式是将整数B的每一位与整数A相乘,并将结果按位拼接。例如121[×]23=242363。实现方法是将B从低位到高位逐位分解,计算与A的乘积并转换为字符串,按顺序拼接结果。提供了C++代码实现,通过取余运算分解数字并使用字符串拼接功能完成计算。
2025-07-19 01:12:59
290
QtUnicodeViewer
2025-10-23
QtValueConverter
2025-10-23
QtStringToolkit
2025-10-23
Qt-Text-Style-Demo - 文本样式演示
2025-10-12
自用分享Qt连接mySQL多表查询工具(极值/差异/并集/交集)
2025-07-25
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅