摘要:
迭代器与 traits 编程技法 迭代器(Iterator)是 STL 的灵魂,它是一种通用指针机制,提供统一的方式来遍历容器中的元素。它允许算法与容器解耦。你可以将算法用于任何支持相同迭代器接口的容器上。 在 C++ STL 中,迭代器是一种对象,它重载了解引用 * 和自增 ++ 操作符,使得用户 阅读全文
posted @ 2025-07-20 19:35
_Sylvan
阅读(23)
评论(0)
推荐(0)
摘要:
C++ 整数提升与移位陷阱 C++ 语言规定,小于或等于 int 的整数类型(如 char, uint8_t, short, bool,以及枚举类型等)在表达式中参与算术、移位或逻辑运算时,会被自动提升为 int 或 unsigned int(根据是否能表示原类型范围)。 引用 cppreferen 阅读全文
posted @ 2025-07-20 19:35
_Sylvan
阅读(75)
评论(0)
推荐(0)
摘要:
C++ INT类重载实现及设计细节 《STL 源码剖析》1.9.4 节代码: #include <iostream> using namespace std; class INT { friend ostream& operator<<(ostream& os, const INT& i); pub 阅读全文
posted @ 2025-07-20 19:35
_Sylvan
阅读(15)
评论(0)
推荐(0)
摘要:
空间配置器 SGI STL 中的 空间配置器(allocator) 是 STL 容器使用内存的核心组件。 在《STL 源码剖析》中,侯捷将其拆解为: 一级配置器(__malloc_alloc_template):大对象,直接调用 malloc/free 二级配置器(__default_alloc_t 阅读全文
posted @ 2025-07-20 19:35
_Sylvan
阅读(24)
评论(0)
推荐(0)
摘要:
multimap std::multimap 是 C++ STL 中的关联容器,它与 std::map 类似,但允许多个相同的键(key)存在。它存储的是键值对(key-value),并且 key 不唯一,但 按 key 排序,每个 key 可以关联多个不同的 value。 基本特性 键允许重复:s 阅读全文
posted @ 2025-07-20 19:34
_Sylvan
阅读(150)
评论(0)
推荐(0)
摘要:
C++ 异常处理 C++ 的异常处理机制是通过 try、throw 和 catch 三个关键字来实现的,其设计目的是在程序发生错误时提供一种清晰的处理流程,而不是像 C 一样靠返回值或错误码。 try { // 可能抛出异常的代码 ... throw 异常对象; // 抛出异常 } catch (异 阅读全文
posted @ 2025-07-20 19:34
_Sylvan
阅读(30)
评论(0)
推荐(0)
摘要:
multiset std::multiset 是 C++ STL 中的关联容器,与 std::set 类似,但它允许容器中存储重复的元素。multiset 元素是按特定顺序排列的,默认按照升序排序,底层通常使用红黑树来实现。 基本特性 元素可重复:与 std::set 不同,std::multise 阅读全文
posted @ 2025-07-20 19:33
_Sylvan
阅读(74)
评论(0)
推荐(0)
摘要:
map std::map 是一个关联容器,以 键值对(key-value) 形式存储数据,具有以下特性: 键是唯一的(key 不可重复) 元素按 key 自动排序(默认升序) 插入、删除、查找等操作的时间复杂度为 O(logN) 底层实现 std::map 底层基于红黑树(Red-Black Tre 阅读全文
posted @ 2025-07-20 19:32
_Sylvan
阅读(22)
评论(0)
推荐(0)
摘要:
set set 是一个基于平衡二叉搜索树(如红黑树)的容器。它会自动对元素进行排序,且保证每个元素在集合中唯一。因为元素是有序的,所以查找、插入和删除的时间复杂度都是 O(log N)。 主要特性: 唯一性:set 中的元素不允许重复。 自动排序:元素会自动按照升序排序,如果需要自定义排序规则,可以 阅读全文
posted @ 2025-07-20 19:32
_Sylvan
阅读(39)
评论(0)
推荐(0)
摘要:
容器体系结构 STL 容器的整体分类 C++ STL 中的容器可以分为三大类: 容器类型 代表容器 简介 序列容器 vector, deque, list, array, forward_list 元素按插入顺序排列 关联容器 set, map, multiset, multimap 自动排序、基于 阅读全文
posted @ 2025-07-20 19:31
_Sylvan
阅读(36)
评论(0)
推荐(0)
摘要:
原子操作和原子类型 原子操作是不可分割的操作,任何线程不会观察到操作“中间态”。如果读取操作是原子的,那么读取到的值要么是初始值,要么是某次完整修改后的值。 非原子操作可能出现“半完成”状态,导致数据竞争和未定义行为。 标准原子类型 标准原子类型定义在 <atomic> 中,操作都是原子的。 is_ 阅读全文
posted @ 2025-07-20 19:31
_Sylvan
阅读(42)
评论(0)
推荐(0)
摘要:
unordered_set std::unordered_set 是一个 存储唯一元素 的集合容器,其特点是: 元素无序(内部使用哈希表) 不允许重复元素 插入、查找、删除操作的 平均时间复杂度为 O(1) 典型使用场景: 判断是否存在某元素(查重) 快速去重 实现集合的“集合运算”:并集、交集、差 阅读全文
posted @ 2025-07-20 19:31
_Sylvan
阅读(142)
评论(0)
推荐(0)
摘要:
unordered_map std::unordered_map 是 C++11 引入 的关联容器,实现了 哈希表(Hash Table)。它基于key-value 对存储数据,通过哈希函数将 key 映射到桶数组(bucket)的位置,支持快速插入、查找、删除。 底层原理 数据结构 底层主要由: 阅读全文
posted @ 2025-07-20 19:31
_Sylvan
阅读(145)
评论(0)
推荐(0)
摘要:
简化代码 使用 future 的函数化编程 函数化编程简介 函数化编程(Functional Programming,FP)是一种编程范式,强调函数的纯粹性。纯函数的特点是: 函数结果只依赖于传入的参数; 对相同的输入参数,多次调用函数都会得到相同的结果; 函数不会改变任何外部状态。 C++标准库中 阅读全文
posted @ 2025-07-20 19:30
_Sylvan
阅读(34)
评论(0)
推荐(0)
摘要:
C++内存模型 内存模型涉及两个方面: 内存布局(即对象如何映射到内存) 并发执行中的内存访问规则 并发编程中,特别是底层的原子操作和内存位置管理非常关键。由于C++中的所有对象都和内存地址紧密相关,因此理解对象与内存位置的关系是基础。 对象和内存位置 对象 是C++程序中的基本数据构成单元。 标准 阅读全文
posted @ 2025-07-20 19:30
_Sylvan
阅读(88)
评论(0)
推荐(0)
摘要:
限时等待与时钟 阻塞调用会将线程挂起一段不确定时间,直到事件发生。一般情况下这种方式很合适,但有时需要限定等待时间,比如发送“我还存活”的心跳,或者用户可以取消等待。 超时等待通常有两种方式: 时间段(duration):指定等待时长,比如等待30毫秒。 时间点(time point):指定具体的绝 阅读全文
posted @ 2025-07-20 19:29
_Sylvan
阅读(243)
评论(0)
推荐(0)
摘要:
Future和异步任务 当在等待某个异步事件(比如机场广播通知登机)时,这种事件对应C++中的 future。future 用于表示某个操作的结果将在未来某个时间可用,线程可以等待这个结果。 C++标准库中有两种 future: std::future<T>:独占所有权,只能有一个对象持有该结果。 阅读全文
posted @ 2025-07-20 19:29
_Sylvan
阅读(27)
评论(0)
推荐(0)
摘要:
线程等待与条件变量 想象下在夜间乘火车下车,有三种选择: 整夜保持清醒 → 持续检查,浪费资源。 设置闹钟 → 有延迟风险(误差/早醒/电池无电)。 司机到站通知你 → 最理想,对应线程条件变量。 这三种方案类比线程等待事件的方式: 持续轮询 + 加锁 会造成 CPU 消耗 + 锁竞争。 间歇休眠( 阅读全文
posted @ 2025-07-20 19:29
_Sylvan
阅读(34)
评论(0)
推荐(0)
摘要:
保护共享数据的方式 互斥量是一种通用的保护共享数据机制,但不是唯一方式。特定情况下,可以用更合适的手段保障共享数据安全。 一种极端情况是共享数据只读且需要保护初始化过程。这时对数据初始化的保护是必要的,但初始化后加锁访问会带来性能开销。 C++标准为保护共享数据初始化提供了专门机制。 保护共享数据的 阅读全文
posted @ 2025-07-20 19:28
_Sylvan
阅读(30)
评论(0)
推荐(0)
摘要:
互斥量保护共享数据 在并发环境下保护共享数据的核心方法之一,就是使用互斥量(mutex)。本文围绕 C++ 标准库中的 std::mutex、std::lock_guard、std::scoped_lock、std::unique_lock 等工具展开,涵盖互斥的基本操作、接口陷阱、死锁问题与避免策 阅读全文
posted @ 2025-07-20 19:28
_Sylvan
阅读(20)
评论(0)
推荐(0)
摘要:
共享数据与条件竞争 在多线程编程中,共享数据的访问和修改是最容易引发问题的地方。如果共享数据只是只读,那么所有线程都能安全地访问这些数据,不会引起冲突;但一旦一个或多个线程尝试修改共享数据,就可能产生严重的问题,需要格外小心,确保所有线程都能正确工作。 不变量(Invariants) 不变量是指在程 阅读全文
posted @ 2025-07-20 19:28
_Sylvan
阅读(19)
评论(0)
推荐(0)
摘要:
线程标识 获取线程标识的两种方式 通过 std::thread 对象获取 std::thread t([]{ /* do something */ }); std::thread::id id = t.get_id(); 如果 std::thread 没有绑定线程,get_id() 返回默认构造的 阅读全文
posted @ 2025-07-20 19:27
_Sylvan
阅读(28)
评论(0)
推荐(0)
摘要:
确定线程数量 C++标准库中的std::thread::hardware_concurrency()函数非常实用,它返回系统支持的并发线程数,通常是CPU的核心数或者硬件线程数。如果无法获取,返回值为0。 方面 物理核心 逻辑核心(硬件线程) 本质 实际的CPU核心 核心上模拟的多线程执行单元 性能 阅读全文
posted @ 2025-07-20 19:27
_Sylvan
阅读(58)
评论(0)
推荐(0)
摘要:
转移所有权 在 C++ 中,std::thread 是一个资源占有类型,它的行为类似于 std::unique_ptr:可移动,但不可复制。这样设计的目的,是为了确保线程的所有权始终只有一个明确的拥有者,避免多线程并发错误。 为什么要支持移动? 当我们创建线程并希望将线程的所有权传递给其他对象(比如 阅读全文
posted @ 2025-07-20 19:27
_Sylvan
阅读(30)
评论(0)
推荐(0)
摘要:
传递参数 在 C++ 中,创建线程时可以向函数传递参数。std::thread 构造函数接受函数指针或可调用对象作为第一个参数,后续参数会传递给该函数(或可调用对象)。 std::thread 的参数传递机制 拷贝(或移动)所有传入的参数; 然后,在新线程启动时,把拷贝(或移动)后的对象当作实参传给 阅读全文
posted @ 2025-07-20 19:26
_Sylvan
阅读(34)
评论(0)
推荐(0)
摘要:
线程的基本操作 每个程序至少有一个线程:主线程(执行 main() 函数)。使用 std::thread 可以创建更多线程,它们与主线程并发运行。 当线程完成任务,其对应的 std::thread 对象必须被妥善处理(如 join() 或 detach()),否则程序会异常终止。 启动线程 启动线程 阅读全文
posted @ 2025-07-20 19:26
_Sylvan
阅读(25)
评论(0)
推荐(0)
摘要:
C++ 多线程初探 什么是并发? 并发是指两个或多个独立活动在同一时间段内交替或同时发生。生活中常见的例子包括:一边走路一边说话、多人各自完成不同任务等。 计算机中的并发 在计算机系统中,并发指的是在同一个系统上同时运行多个任务。传统的单核处理器通过“任务切换”模拟出并发的效果;而现代多核处理器实现 阅读全文
posted @ 2025-07-20 19:25
_Sylvan
阅读(14)
评论(0)
推荐(0)
摘要:
条款41:对于移动成本低且总是被拷贝的可拷贝形参,考虑按值传递 背景 许多函数参数是可拷贝类型(如 std::string),需要将参数拷贝或移动到类成员或容器中。如何高效且简洁地写这类函数是一个常见问题。 传统解决方案有两种: 重载:对左值传引用,右值传右值引用。 通用引用模板:用模板 T&& 接 阅读全文
posted @ 2025-07-20 19:25
_Sylvan
阅读(20)
评论(0)
推荐(0)
摘要:
条款42:考虑使用置入(emplace)代替插入(insert) 背景 假设有一个 std::vector<std::string>,我们想往里面添加字符串。 std::vector<std::string> vs; // std::string 的容器 vs.push_back("xyzzy"); 阅读全文
posted @ 2025-07-20 19:25
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款34:优先使用 Lambda 而非 std::bind std::bind 是 C++98 中 std::bind1st 和 std::bind2nd 的后续版本,2005 年成为非正式标准库一部分。 C++11 引入了 lambda,C++14 中 lambda 功能更加强大。 现在,lamb 阅读全文
posted @ 2025-07-20 19:24
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款33:对 auto&& 形参使用 decltype 以 std::forward 它们 C++14 支持泛型 lambda,可以用 auto 作为形参类型,实现模板化的 operator()。 问题 普通写法: auto f = [](auto x) { return func(normaliz 阅读全文
posted @ 2025-07-20 19:24
_Sylvan
阅读(23)
评论(0)
推荐(0)
摘要:
条款32:使用初始化捕获来移动对象到闭包中 核心问题 在 C++11 中,lambda 无法将对象移动进闭包,只能: 按值捕获(复制) 按引用捕获(依赖外部生命周期) 这在以下两种情况下非常不便: 捕获的对象是只能移动的(如 std::unique_ptr, std::future) 捕获的对象复制 阅读全文
posted @ 2025-07-20 19:24
_Sylvan
阅读(22)
评论(0)
推荐(0)
摘要:
条款31:避免使用默认捕获模式 背景概述 C++11 提供两种默认捕获模式: [&]:按引用捕获所有使用到的局部变量。 [=]:按值捕获所有使用到的局部变量。 虽然简洁,但这两种模式都存在隐含风险,应尽量避免。 按引用默认捕获 [&] 的风险 悬空引用 如果 lambda 捕获了局部变量的引用,而 阅读全文
posted @ 2025-07-20 19:24
_Sylvan
阅读(31)
评论(0)
推荐(0)
摘要:
条款30:万能引用的完美转发失败情况 完美转发简介 完美转发的核心是将函数的参数“完美地”转发给另一个函数,保持参数的类型、左值/右值属性、const/volatile属性不变。 万能引用(也称通用引用)使得模板函数能接受左值和右值参数,通过 std::forward<T> 保持实参特性传递。 例如 阅读全文
posted @ 2025-07-20 19:23
_Sylvan
阅读(33)
评论(0)
推荐(0)
摘要:
条款29:认识移动操作的缺点 假定移动操作不存在,成本高,未被使用。 移动语义简介 C++11 引入移动语义,允许用开销低的移动操作替代高成本的复制操作,从而提升性能。编译器会在满足条件时默认生成移动构造函数和移动赋值操作。 但是: 并不是所有类型都支持移动操作。 有些移动操作并不比复制操作快。 移 阅读全文
posted @ 2025-07-20 19:22
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款28:理解引用折叠 万能引用的模板推导原理 template<typename T> void func(T&& param); 当传入左值时,T 会被推导为左值引用类型,如 Widget&。 当传入右值时,T 会被推导为非引用类型,如 Widget。 示例: Widget w; // 左值 W 阅读全文
posted @ 2025-07-20 19:22
_Sylvan
阅读(32)
评论(0)
推荐(0)
摘要:
条款27:熟悉万能引用重载的替代方法 背景示例 std::multiset<std::string> names; template<typename T> void logAndAdd(T&& name) { auto now = std::chrono::system_clock::now(); 阅读全文
posted @ 2025-07-20 19:22
_Sylvan
阅读(17)
评论(0)
推荐(0)
摘要:
条款26:避免在万能引用上重载 背景示例 假设有个函数,需要用名字打印日志并加入全局集合: std::multiset<std::string> names; // const 左值引用既能绑定左值,也能绑定右值(包括临时对象) void logAndAdd(const std::string& n 阅读全文
posted @ 2025-07-20 19:21
_Sylvan
阅读(12)
评论(0)
推荐(0)
摘要:
条款24:区分万能引用与右值引用 核心结论 判断条件 结果 是 T&&,并且发生类型推导 万能引用 是 T&&,但没有类型推导 右值引用 const T&& / vector<T>&& 等非标准形式 右值引用 auto&&,发生类型推导 万能引用 万能引用(Universal Reference) 阅读全文
posted @ 2025-07-20 19:21
_Sylvan
阅读(35)
评论(0)
推荐(0)
摘要:
条款 25:对右值引用使用 std::move,对万能引用使用 std::forward 核心要点 引用类型 用法 原因 右值引用 T&& 使用 std::move(x) 因为它总绑定右值,无条件移动 万能引用 T&& 使用 std::forward<T>(x) 可能绑定左值或右值,需有条件地转发 阅读全文
posted @ 2025-07-20 19:21
_Sylvan
阅读(31)
评论(0)
推荐(0)
摘要:
条款20:当 std::shared_ptr 可能悬空时使用 std::weak_ptr 核心思想 std::weak_ptr 是一个非拥有型智能指针,它指向 std::shared_ptr 所管理的对象,但不增加引用计数。 std::weak_ptr 可以在对象被销毁时检测出自己是否悬空。 设计动 阅读全文
posted @ 2025-07-20 19:20
_Sylvan
阅读(17)
评论(0)
推荐(0)
摘要:
条款21:优先使用 std::make_unique 和 std::make_shared 而非直接使用 new 背景与引入 std::make_shared 从 C++11 标准开始提供。 std::make_unique 从 C++14 标准开始提供,C++11 中可自定义实现。 这两个“mak 阅读全文
posted @ 2025-07-20 19:20
_Sylvan
阅读(47)
评论(0)
推荐(0)
摘要:
条款22:Pimpl 需在实现文件定义特殊函数 当在类中使用 Pimpl(Pointer to Implementation)惯用法,并用 std::unique_ptr 管理实现类指针时,类的特殊成员函数(如:析构函数、移动构造函数、拷贝构造函数等)不能只在头文件中默认生成,而必须在 .cpp 实 阅读全文
posted @ 2025-07-20 19:20
_Sylvan
阅读(17)
评论(0)
推荐(0)
摘要:
条款23:理解 std::move 和 std::forward 简介 移动语义 允许编译器用“廉价”的移动操作代替“昂贵”的拷贝操作。通过移动构造函数和移动赋值操作符,程序员可以控制对象如何被“移动”而不是复制。它使得一些类型(如 std::unique_ptr、std::future、std:: 阅读全文
posted @ 2025-07-20 19:20
_Sylvan
阅读(157)
评论(0)
推荐(0)
摘要:
条款16:让 const 成员函数线程安全 背景与问题 const 成员函数在概念上不修改对象状态,是“只读操作”。 但实际中,为了性能或便利,const 函数可能做缓存(lazy evaluation),修改某些 mutable 成员(比如缓存值和状态标志)。 如果多个线程同时调用同一个对象的 c 阅读全文
posted @ 2025-07-20 19:19
_Sylvan
阅读(33)
评论(0)
推荐(0)
摘要:
条款17:理解特殊成员函数的生成 什么是特殊成员函数? 特殊成员函数是指编译器自动生成的成员函数,主要包括: 默认构造函数(Default Constructor) 析构函数(Destructor) 拷贝构造函数(Copy Constructor) 拷贝赋值运算符(Copy Assignment O 阅读全文
posted @ 2025-07-20 19:19
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款18:使用 std::unique_ptr 管理独占资源 智能指针为何重要? 原始指针的缺点: 无法区分单个对象还是数组(影响 delete 方式) 不清楚是否应销毁资源(是否拥有所有权) 不知道如何销毁资源(delete、delete[] 或其他机制) 容易出现资源泄露或重复释放 难以处理异常 阅读全文
posted @ 2025-07-20 19:19
_Sylvan
阅读(26)
评论(0)
推荐(0)
摘要:
条款19:使用 std::shared_ptr 管理共享资源 std::shared_ptr 提供共享所有权的资源管理方式,其背后使用引用计数。 在不引入垃圾回收机制的同时,实现了自动销毁和析构时机可预期的资源管理。 是 C++ 中模拟“垃圾回收”的一种方式,但销毁是确定性的。 内部机制与实现细节 阅读全文
posted @ 2025-07-20 19:19
_Sylvan
阅读(24)
评论(0)
推荐(0)
摘要:
条款12:使用 override 声明重写函数 在 C++ 面向对象中,派生类可以重写(override)基类的虚函数,实现多态。 重写与重载不同,重写是基类和派生类中同名、参数、常量性、返回类型兼容的虚函数。 重写时,基类函数必须是 virtual,派生类函数名、参数、const、引用限定符等必须 阅读全文
posted @ 2025-07-20 19:18
_Sylvan
阅读(69)
评论(0)
推荐(0)
摘要:
条款13:优先考虑 const_iterator 而非 iterator 只要不需要修改元素,就应优先使用 const_iterator。 const_iterator 只保证不能通过它修改元素本身 不限制操作容器结构(如插入、删除) 理由同“能加 const 就加”的通用准则:可读性更高、语义更明 阅读全文
posted @ 2025-07-20 19:18
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款14:如果函数不抛出异常请使用 noexcept 为什么使用 noexcept 更安全的接口设计: noexcept 是函数接口的一部分,明确告知调用者「不会抛异常」。 启用更多优化: 编译器对 noexcept 函数可以省略异常处理机制,生成更高效代码。 支持 STL 的强异常安全保证: 如 阅读全文
posted @ 2025-07-20 19:18
_Sylvan
阅读(20)
评论(0)
推荐(0)
摘要:
条款15:尽可能使用 constexpr constexpr 表示一个值不仅是常量(const),而且必须在编译期已知。 constexpr 对象 vs 函数 用法 描述 constexpr 变量 必须在编译期能被计算,且隐含 const。 constexpr 函数 如果传入编译期常量,结果也会是编 阅读全文
posted @ 2025-07-20 19:18
_Sylvan
阅读(13)
评论(0)
推荐(0)
摘要:
条款 8:优先考虑 nullptr 而非 0 和 NULL 原因一:0 和 NULL 本质是整型,不是指针 表达式 实际类型 0 int NULL 实现相关,通常是 int 或 long,但不是指针类型 nullptr std::nullptr_t,可以隐式转换为任意类型的指针 原因二:函数重载中容 阅读全文
posted @ 2025-07-20 19:17
_Sylvan
阅读(14)
评论(0)
推荐(0)
摘要:
条款9:优先考虑别名声明 (using) 而非 typedef 基本用法对比 类型 语法 示例 typedef 旧写法(C++98) typedef std::vector<int> VecInt; using(别名声明) 新写法(C++11) using VecInt = std::vector< 阅读全文
posted @ 2025-07-20 19:17
_Sylvan
阅读(31)
评论(0)
推荐(0)
摘要:
条款10:优先考虑限域 enum 而非未限域 enum 作用域区别 未限域枚举(unscoped enum,C++98风格) 枚举值(enumerator)直接泄漏到枚举所在的作用域中,可能导致命名冲突。 enum Color { black, white, red }; // black, whi 阅读全文
posted @ 2025-07-20 19:17
_Sylvan
阅读(7)
评论(0)
推荐(0)
摘要:
条款11:优先考虑使用 deleted 函数,而非使用未定义的私有声明 背景与问题 在 C++98 中,想禁止某些特殊成员函数(如拷贝构造函数、拷贝赋值运算符)被调用,常用做法是将它们声明为私有(private)且不定义。 这样做虽然防止了外部调用,但如果在成员函数或友元中调用这些函数,只能在链接阶 阅读全文
posted @ 2025-07-20 19:17
_Sylvan
阅读(18)
评论(0)
推荐(0)
摘要:
条款6:当 auto 推导不如预期时,显式类型初始化的必要性 使用 auto 虽然带来便利和一致性,但当表达式返回的是代理类对象时,auto 有可能推导出非预期的类型,从而导致程序行为错误,甚至产生未定义行为。 std::vector<bool> std::vector<bool> features 阅读全文
posted @ 2025-07-20 19:16
_Sylvan
阅读(14)
评论(0)
推荐(0)
摘要:
条款5:优先考虑auto而非显式类型声明 优先使用 auto 代替显式类型声明,除非这样会损害代码的可读性或导致类型推导错误。使用 auto 不只是图省事,它能带来: 更强的类型安全 更少的重复 更高的可移植性 更少的维护负担 避免未初始化变量 int x; // 可能未初始化 auto y; // 阅读全文
posted @ 2025-07-20 19:16
_Sylvan
阅读(8)
评论(0)
推荐(0)
摘要:
条款7:区别使用()和{}创建对象 C++ 中的三种初始化方式 方式 示例 说明 圆括号 () int x(0); 传统构造语法 等号 = int x = 0; 赋值初始化 花括号 {} int x{0}; C++11 引入的统一初始化方式,称作 brace initialization 花括号初始 阅读全文
posted @ 2025-07-20 19:16
_Sylvan
阅读(21)
评论(0)
推荐(0)
摘要:
条款2:auto 类型推导 auto 与模板类型推导的对应关系 虽然 auto 不直接用于模板、函数或形参,但它与模板类型推导之间存在一一映射的关系,可以通过一个非常规范和系统的流程相互转换。 对应关系类比 template<typename T> void f(ParamType param); 阅读全文
posted @ 2025-07-20 19:15
_Sylvan
阅读(25)
评论(0)
推荐(0)
摘要:
条款3:理解 decltype decltype(expr) 会返回表达式 expr 的类型(精确地,不做修改)。 它不像 auto 使用模板类型推导规则,不会剥去引用、cv 限定等信息。 const int i = 0; decltype(i) // const int bool f(const 阅读全文
posted @ 2025-07-20 19:15
_Sylvan
阅读(22)
评论(0)
推荐(0)
摘要:
条款4:类型推导结果的查看方式 选择什么工具查看类型推导,取决于希望在哪个阶段获取类型信息:编辑时、编译时、或运行时。 编辑时:通过 IDE 提示 鼠标悬停即可查看变量/参数/函数的推导类型。 需要代码处于基本可编译状态。 const int theAnswer = 42; auto x = the 阅读全文
posted @ 2025-07-20 19:15
_Sylvan
阅读(13)
评论(0)
推荐(0)
摘要:
C++ 返回值优化(RVO) 当函数返回一个对象时,按照传统理解,编译器会: 在函数内部创建一个临时对象(返回值对象)。 通过拷贝构造函数或移动构造函数,将临时对象拷贝或移动到调用者的变量。 这可能导致一次或多次额外的对象构造、拷贝、移动,影响性能。 返回值优化(RVO,Return Value O 阅读全文
posted @ 2025-07-20 19:12
_Sylvan
阅读(94)
评论(0)
推荐(0)
摘要:
Qt 信号与槽连接成功的本质与时机 信号与槽连接的本质 Qt 信号槽机制基于元对象系统(Meta-Object System),使用 connect() 函数在运行时建立信号和槽之间的映射。 connect(sender, signal, receiver, slot) 在调用时,会将发送者对象的信 阅读全文
posted @ 2025-07-20 19:10
_Sylvan
阅读(68)
评论(0)
推荐(0)
摘要:
SlideshowDialog 动画启动时机导致 startMusic 信号失效问题及正确触发流程总结 在 Qt 项目中,有一个 SlideshowDialog 类,其中的子控件 AnimationWidget 会在启动动画时发射信号 startMusic(),用于通知外部开始播放音乐。 Slide 阅读全文
posted @ 2025-07-20 18:44
_Sylvan
阅读(14)
评论(0)
推荐(0)
摘要:
AnimationWidget 析构时发射 stopMusic 信号崩溃 AnimationWidget 类负责播放图片动画,同时通过信号控制背景音乐的播放、暂停和停止。 在项目中,AnimationWidget 的析构函数中直接调用了 emit stopMusic(),用于通知音乐停止。 问题描述 阅读全文
posted @ 2025-07-20 18:43
_Sylvan
阅读(19)
评论(0)
推荐(0)
摘要:
QSS QSS(Qt Style Sheets)是 Qt 的样式系统,用于美化控件,控制控件的颜色、边框、字体、背景、间距等外观效果。它的语法类似于 Web 的 CSS,但有自己的限制和扩展。 QSS 的应用方式 QSS 可以通过以下方式应用: 方式 说明 widget->setStyleSheet 阅读全文
posted @ 2025-07-20 18:42
_Sylvan
阅读(76)
评论(0)
推荐(0)
摘要:
替代 Qt6 废弃的 QMediaPlaylist 废弃说明:Qt 6 中移除了 QMediaPlaylist,QMediaPlayer 也不再内置播放列表支持。 Qt6 移除了官方 QMediaPlaylist,需要自己实现一个简单的播放列表管理类,负责管理媒体文件列表、当前索引、循环模式等。然后 阅读全文
posted @ 2025-07-20 18:41
_Sylvan
阅读(291)
评论(0)
推荐(0)
摘要:
QPixmap QPixmap 是 Qt 中用于显示位图图像的类,适合 GUI 界面绘制。它在后台会尽可能使用硬件加速,在屏幕上显示时性能很好,但不适合频繁修改像素数据。 主要特点 只能在 GUI 线程中使用(需要 GUI 环境) 支持透明通道(Alpha) 适合快速绘制 不适合像素逐点修改,若需要 阅读全文
posted @ 2025-07-20 18:41
_Sylvan
阅读(194)
评论(0)
推荐(0)
摘要:
QTimer QTimer 是 Qt 框架中提供的一个用于事件驱动定时操作的类,属于 QObject 派生类。它常用于定时更新 UI、实现延时处理、周期性任务执行等功能。 基本用法 周期性定时器(循环触发) QTimer *timer = new QTimer(this); connect(time 阅读全文
posted @ 2025-07-20 18:40
_Sylvan
阅读(137)
评论(0)
推荐(0)
摘要:
Qt 事件系统 Qt 的事件系统是一个事件驱动架构,它让程序能够响应用户操作(鼠标、键盘等)、系统消息(窗口调整、定时器)、以及自定义事件。所有事件都被封装为 QEvent 对象,通过事件循环分发给对应的 QObject(尤其是 QWidget)处理。 事件系统的核心类和概念 类 / 概念 作用简介 阅读全文
posted @ 2025-07-20 18:40
_Sylvan
阅读(54)
评论(0)
推荐(0)

浙公网安备 33010602011771号