- 博客(29)
- 收藏
- 关注
原创 指数型枚举
特征描述目的枚举一个集合的所有子集结果数量2ⁿ,是指数级常用方法1.递归/DFS:思路清晰,易于理解和扩展。2.位运算:代码简洁,运行效率高。应用场景是许多复杂算法(如状态压缩DP、子集和问题、最大团问题等)的基础。当问题规模不大(n < 25)时,这是一种有效的暴力解决方法。简单来说,指数型枚举就是系统地、不重复不遗漏地找出“所有可能的组合”的过程,它是算法学习中一个非常重要的基础技能。
2025-11-15 18:05:23
269
原创 C++中父类和子类的构造析构关系
核心原则:子类的任何构造函数(无论无参还是有参)执行时,必须先调用父类的某个构造函数;自动调用的条件:仅当父类存在默认构造函数(无参或全默认参数),且子类构造函数未在初始化列表中显式调用父类其他构造函数时,才会自动调用父类的默认构造;显式调用的必要性:若父类不存在默认构造函数,子类的任何构造函数(无参或有参)都必须在初始化列表中显式调用父类的带参构造函数,否则编译报错;灵活性:子类的有参构造函数可以通过初始化列表,将自身参数传递给父类的构造函数,实现父子类参数的联动。子类无法绕过父类的构造函数。
2025-10-22 14:30:00
745
原创 C++ 运算符重载:类内与类外重载详解
运算符重载是 C++ 中的一种多态形式,它允许我们为自定义类型(类或结构体)定义运算符的行为。通过运算符重载,我们可以让自定义类型像内置类型一样使用运算符,使代码更加直观和易读。运算符重载是 C++ 中强大的特性,合理使用可以使代码更加直观和易读。选择类内重载还是类外重载取决于具体需求:类内重载更适合修改当前对象的运算符类外重载更适合需要对称性或左操作数不是当前类对象的运算符在实际开发中,应根据运算符的语义和使用场景选择最合适的重载方式。
2025-09-20 16:35:44
422
原创 C++ 内置类型与运算符重载详解
内置类型(也称为基本类型或原生类型)是C++语言本身提供的数据类型,不需要用户定义即可使用。内置类型是C++语言提供的基本数据类型只能为用户自定义类型(类和枚举)重载运算符不能为内置类型重载运算符,这是C++语言的明确限制如果需要为内置类型提供特殊操作,应该使用普通函数而不是运算符重载这个限制确保了C++代码的一致性和可预测性,是语言设计的一个重要原则。
2025-09-20 15:47:16
225
原创 C++ 参数传递方式详解
传递方式适用场景优点缺点值传递小型数据类型简单安全,不影响原始值复制开销大(大型对象)指针传递需要修改原始值,可选参数可以修改原始值,可以传递null语法复杂,可能空指针异常引用传递需要修改原始值语法简洁,比指针安全不能传递nullconst引用大型对象,只读访问避免复制,保护原始数据不能修改参数移动语义资源管理对象避免复制,转移所有权原始对象状态未定义数组传递C风格数组直接操作数组元素需要额外传递大小信息默认参数简化函数调用调用灵活。
2025-09-20 14:20:42
1321
原创 函数返回类型中的&和参数列表中的&
参数列表中的:解决 “函数如何接收外部对象” 的问题,决定是否创建副本、能否修改外部对象;返回类型中的:解决 “函数如何向外部返回结果” 的问题,决定返回的是引用还是副本、能否通过返回值修改原对象。两者虽都基于 “引用” 语法,但作用场景和目的完全独立,需根据具体需求分别设计。
2025-09-20 14:16:47
252
原创 函数返回类型引用
这种形式,核心是 函数返回类型为 “类的引用”(),与返回 “类的值”(,不加)的区别在于:函数返回的是对象的引用(别名) 还是副本,这会直接影响返回值的使用方式和内存行为。函数返回的是某个已存在对象的引用(可以理解为该对象的 “别名”),而非新副本。可以看到:返回引用时没有创建副本,且对返回值的修改会直接影响原始对象。函数返回的是对象的副本(通过拷贝构造函数创建的新对象)。可以看到:返回值时会创建副本,且对副本的修改不影响原始对象。不能返回局部对象的引用:局部对象在函数结束后会被销
2025-09-20 14:15:00
402
原创 C++ 中的 delete 与 default 关键字详解
特性deletedefault目的禁止函数使用显式生成默认实现适用函数任何函数特殊成员函数主要用途1. 禁止拷贝/移动2. 禁止特定重载3. 禁止隐式转换1. 恢复默认构造函数2. 显式声明特殊成员3. 保持平凡类型特性编译检查编译时报错编译时生成代码对类的影响使类不可拷贝/不可调用保持类的平凡性(trivial)C++版本C++11 引入C++11 引入// 未来可能支持delete和defaultdelete提供更强的接口约束能力default提供更清晰的默认行为控制。
2025-08-18 20:04:30
887
原创 C++ 指针赋值深度解析:p = q vs *p = *q
特性p = q(指针赋值)*p = *q(解引用赋值)操作对象指针变量本身指针指向的内存内容内存变化改变指针存储的地址改变指针指向地址的内容别名效应创建新别名不创建别名数据复制仅复制地址复制实际值指针关系指向相同地址指向不同地址内存风险内存泄漏、悬空指针空指针解引用、浅拷贝问题适用场景共享访问、数据结构数据复制、值修改智能指针shared_ptr增加计数unique_ptr需要移动行为与原始指针相同核心区别p = q*p = *q操作本质改变指针变量存储的地址改变指针指向内存的内容。
2025-08-18 18:56:58
908
原创 C++ 指针与 C 语言指针的深度比较
特性C 指针C++ 指针内存管理手动 (手动或智能指针 (new/delete, RAII)类型安全弱类型安全强类型系统,类型转换操作符空指针NULL(通常为 0)nullptr(类型安全的空指针)面向对象支持无直接支持支持多态、虚函数、成员指针引用类型无有引用类型 (),作为指针替代函数指针支持简单函数指针支持成员函数指针和函数对象模板支持无支持模板和泛型指针使用 C 风格指针的情况与 C 库交互的兼容层嵌入式系统等受限环境需要极致性能的底层操作使用 C++ 现代指针的情况。
2025-08-18 18:41:26
1317
原创 深入详解 C++ forward
只与通用引用结合使用仅在模板函数中使用T&&参数时才有意义显式指定模板参数:必须使用形式,让编译器知道原始类型保持转发路径简短:避免在多个函数间多次转发同一参数注意对象生命周期:转发右值后,原始对象可能不再有效处理特殊类型对于初始化列表,使用显式类型创建对于位域,创建临时副本对于重载函数,使用函数指针或 lambda 包装结合现代 C++ 特性正确使用可以:避免不必要的对象拷贝保持移动语义优化编写更通用的库代码提升程序性能。
2025-08-18 18:24:53
606
原创 C++ move
概念作用std::move将左值转为右值引用,标记对象可被移动(不实际移动资源)移动构造函数:接管other的资源,置空other的状态移动赋值运算符:释放当前资源,接管other的资源右值引用 (T&&绑定到临时对象或的结果,支持移动语义。
2025-08-18 17:59:09
602
原创 C++ const
const的核心作用是保护数据不被意外修改避免程序中的逻辑错误(如误修改常量)。让编译器进行更严格的检查,提高代码安全性。帮助编译器进行优化,提升程序性能。理解const的各种用法是掌握 C++ 的重要基础,尤其在指针和类的场景中需要特别注意其位置和含义。
2025-08-18 17:45:31
472
原创 C++ 中,花括号 {} 和圆括号 () 用于对象初始化时存在重要区别
特性花括号A a{...};圆括号A a(...);构造函数优先级优先精确匹配普通构造函数窄化转换❌ 禁止✅ 允许解析歧义❌ 无歧义✅ 可能有函数声明歧义聚合初始化✅ 支持❌ C++20 前不支持空初始化✅ 值初始化❌ 函数声明陷阱explicit构造函数✅ 支持✅ 支持防止意外类型转换✅ 更安全⚠️ 较弱。
2025-08-16 16:53:28
345
原创 C++中的引示调用和显示调用
特性隐式调用显式调用触发方式编译器自动插入程序员手动编写代码代码可见性无直接调用代码有明确的调用语句(如func()典型场景构造/析构、类型转换、运算符重载普通函数调用、手动资源管理控制权由编译器控制由程序员控制explicit关键字用于禁止隐式转换(如不适用。
2025-08-16 16:30:19
406
原创 函数指针和指针函数
特性指针函数函数指针本质函数(返回指针)指针(指向函数)声明格式操作符函数调用运算符()指针解引用(可选)内存占用函数代码段指针大小(通常4/8字节)典型用途返回动态分配的内存回调函数、策略模式赋值操作定义函数实现指向已有函数高级用法:函数指针数组// 函数指针数组示例(计算器核心)add, // 索引0:加法sub, // 索引1:减法[3] = NULL // 索引3:空指针// 加法// 输出:11。
2025-08-04 10:40:12
264
原创 int add(int* a, int* b) 和 int *add(int a, int b)
需要返回新数据 → 使用 int *add(int a, int b),但注意内存管理。需要操作或修改外部数据 → 使用 int add(int* a, int* b)。简单计算并返回值 → 直接使用值传递:int add(int a, int b)。返回静态变量或全局变量的地址(可能引发线程安全问题)。动态内存分配后返回指针(需手动释放)。返回值:返回一个 int*(整型指针)。参数:接受两个 int*(整型指针)。参数:接受两个 int 类型的值。返回值:返回一个 int 类型值。
2025-04-10 16:47:42
282
原创 C语言 内存管理方法
动态内存空间在操作系统的堆区中,我们平常在定义变量或数组的时候都属于局部变量和局部数组,这些局部变量和局部数组都存储在操作系统的栈区里面,想要了解栈区,我们就要知道线程和进程操作系统分配资源的最基本单位是进程,当我们运行自己程序的时候对于操作系统来说就是开启了一个进程,然后我们所有申请的空间(函数里面开辟的局部变量,动态申请内存)都会分配到当前的这个进程CPU计算的最基本单位是线程多线程程序。
2024-12-10 15:18:45
2190
原创 C语言之sizeof
在 C 语言中,sizeof是一个(而不是函数),用于获取一个变量或数据类型所占用的内存字节数。它在编译时就会被计算,因此是一个,不会在程序运行时产生开销。
2024-12-10 11:33:18
1508
原创 指针 p1 与 *p1
p1:指针变量,表示存储的地址。*p1:通过指针访问的值,即p1所指向地址存储的值(这里是n的值)。程序中部分输出类型可能需要修正,比如地址打印用%p,整数打印用%d,否则会有不匹配的警告或错误。
2024-12-09 21:25:07
382
原创 字符数组和字符串数组的区别
是一个存储单个字符的数组。本质:一个包含char类型的多个元素的数组,可以用来存储字符数据,也可以用来存储字符串(如果包含字符串结束符'\0'是一个存储多个字符串的数组。本质:一个二维数组,每行存储一个字符串,或者一个指针数组,每个指针指向一个字符串的首地址。字符数组:用来存储单个字符串。字符串数组:用来存储多个字符串,可以用二维字符数组或字符指针数组实现。
2024-11-28 20:37:39
751
1
原创 字符串与数组的运用和存储(简单&易懂版)
arr是数组的名称,传递给scanf时被视为指向数组首元素的指针。的作用是从标准输入中读取一个字符串,并存储到arr中。不用arr[]是因为在调用时,数组已经自动退化为指针,只需传递数组的名称即可。
2024-11-28 20:34:06
348
原创 Visual Studio 2022 编译错误 C4996(改进版)
【代码】Visual Studio 2022 编译错误 C4996(改进版)
2024-09-18 16:36:51
1069
原创 针对Visual Studio 2022 找不到指定文件 C4996的解决方法
可能是你的代码使用标记为“已弃用”的函数、类成员、变量或 typedef。符号是使用修饰符或 C++14属性弃用的。实际的 C4996 警告消息由声明的deprecated修饰符或属性指定。
2023-10-23 08:55:08
440
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅