Category: 程序设计
C++ 左值(lvalue)、右值(rvalue)与右值引用(rvalue reference) 理解 C++ 中的左值、右值及其引用形式,是掌握现代 C++(尤其是 C++11 以后的移动语义/move和完美转发/perfect forwarding)必不可少的基础。 📌 什么是左值(lvalue) 左值指的是有名字、可寻址的对象,通常可以出现在赋值语句的左侧。 int x = 10; x = 20; // x 是左值 int* p = &x; // 可以取地址 …
C++ assert 与 static_assert 的区别 C++ 提供了两种机制来验证程序中的假设(断言):assert 和 static_assert。虽然它们看起来类似,但它们在不同的阶段工作,并且用途也不同。 🔍 assert — 运行时检查/断言 assert 用于在程序运行时验证条件是否成立。如果条件为假,程序会打印错误信息并中止运行。 #include <cassert> int divide(int x, int y) { assert(y != 0); // 如果 y …
为什么 auto_ptr 在 C++ 中被弃用 TLDR; 很久之前看到auto_ptr就觉得挺好,和auto一样,反正不用自己管,C++会自动推导智能指针的类型。不过这个关键字已经在C++ 11中被弃用/deprecated。 弃用与移除 std::auto_ptr 在 C++ 11 中被弃用。 在 C++ 17 中被完全移除。 为什么 auto_ptr 被弃用? 它具有不安全的拷贝语义/copy semantics。 拷贝一个 auto_ptr 会转移所有权,并将原指针设为 nullptr。 这种行为很容易引发 bug,尤其是在标准容器或算法中使用时。 …
本文详细讲诉了用脚本实现定时模拟计算机按键,用于保持系统一直在线的状态。脚本可以使用VBScript、JScript和Powershell。这三种脚本语言都是微软/Microsoft的,不过前两种已经要被淘汰了。 在 Windows 环境下,这三种脚本(PowerShell、VBScript 和 JScript)都通过 CreateObject 来调用 COM 对象 WScript.Shell,以实现模拟按键的功能。例如,可以每隔一分钟模拟按下 Scroll Lock 键一次,从而保持“在线”状态(Keep Alive)。Scroll Lock 键在某些键盘上可能不存在,其作用是切换滚动锁定状态,连续按两次不会对系统造成实际影响。 模拟按键:自动化任务脚本 有时候,你可能想模拟按键(键盘输入),例如为了自动化一些任务,相比查找 API 并写脚本,通过重复按键可能更简单。例如,你想打开任何聊天窗口并输入 “Hello!” 100 次,可以使用 PowerShell 编写一个脚本,它先暂停几秒钟,然后模拟按键。 你可以通过在 Windows 中使用 …
C++:什么是 consteval?它与 const 和 constexpr 有何不同? 如果你在 C++ 中经常使用 const 和 constexpr,可能会好奇 C++20 新引入的 consteval 关键字到底是做什么用的。下面我们来一一解析。 什么是 consteval? consteval 用于声明一个立即函数(immediate function),也就是说,这个函数必须在编译期进行求值。与 constexpr 不同,constexpr 允许函数在编译期或运行期执行,而 consteval 强制要求只能在编译期调用。 consteval int square(int …
C++ const 与 constexpr:真正的区别是什么? 一眼看都是定义常量。 为什么这很重要 现代 C++ 鼓励编写不可变、高效且表达力强的代码。两个关键字—const 和 constexpr—是这一理念的核心。它们看起来很相似,但理解它们的不同语义,对于正确利用编译期与运行期行为至关重要。 高层次对比 特性 const constexpr 编译期常量? 可能 一定(否则编译报错) 支持运行期? 支持 支持(在需要时运行期求值) 用于数组/模板参数? 仅当确实是常量 保证可用 允许函数? 仅限成员函数限定符 支持完整函数且可在编译期求值 1 声明不可变数据 const:构造后不可变 …
C++20 引入了 ranges(范围),这是一个强大且优雅的抽象,用于处理序列(如数组、vector 等)。相比传统的迭代器或旧式循环,Ranges 提高了代码的可读性、可组合性和性能。 什么是 Range? 在 C++20 中,range(范围) 是一种抽象,代表一个可以迭代的元素序列。它与 views(视图) 和 actions(操作) 如过滤、转换等配合使用非常自然。 传统循环 vs 基于 Range 的循环 #include <iostream> #include <vector> int main() { std::vector<int> v …