- 博客(22)
- 收藏
- 关注
原创 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
640
原创 C++ 指针赋值深度解析:p = q vs *p = *q
特性p = q(指针赋值)*p = *q(解引用赋值)操作对象指针变量本身指针指向的内存内容内存变化改变指针存储的地址改变指针指向地址的内容别名效应创建新别名不创建别名数据复制仅复制地址复制实际值指针关系指向相同地址指向不同地址内存风险内存泄漏、悬空指针空指针解引用、浅拷贝问题适用场景共享访问、数据结构数据复制、值修改智能指针shared_ptr增加计数unique_ptr需要移动行为与原始指针相同核心区别p = q*p = *q操作本质改变指针变量存储的地址改变指针指向内存的内容。
2025-08-18 18:56:58
792
原创 C++ 指针与 C 语言指针的深度比较
特性C 指针C++ 指针内存管理手动 (手动或智能指针 (new/delete, RAII)类型安全弱类型安全强类型系统,类型转换操作符空指针NULL(通常为 0)nullptr(类型安全的空指针)面向对象支持无直接支持支持多态、虚函数、成员指针引用类型无有引用类型 (),作为指针替代函数指针支持简单函数指针支持成员函数指针和函数对象模板支持无支持模板和泛型指针使用 C 风格指针的情况与 C 库交互的兼容层嵌入式系统等受限环境需要极致性能的底层操作使用 C++ 现代指针的情况。
2025-08-18 18:41:26
1120
原创 深入详解 C++ forward
只与通用引用结合使用仅在模板函数中使用T&&参数时才有意义显式指定模板参数:必须使用形式,让编译器知道原始类型保持转发路径简短:避免在多个函数间多次转发同一参数注意对象生命周期:转发右值后,原始对象可能不再有效处理特殊类型对于初始化列表,使用显式类型创建对于位域,创建临时副本对于重载函数,使用函数指针或 lambda 包装结合现代 C++ 特性正确使用可以:避免不必要的对象拷贝保持移动语义优化编写更通用的库代码提升程序性能。
2025-08-18 18:24:53
405
原创 C++ move
概念作用std::move将左值转为右值引用,标记对象可被移动(不实际移动资源)移动构造函数:接管other的资源,置空other的状态移动赋值运算符:释放当前资源,接管other的资源右值引用 (T&&绑定到临时对象或的结果,支持移动语义。
2025-08-18 17:59:09
339
原创 C++ const
const的核心作用是保护数据不被意外修改避免程序中的逻辑错误(如误修改常量)。让编译器进行更严格的检查,提高代码安全性。帮助编译器进行优化,提升程序性能。理解const的各种用法是掌握 C++ 的重要基础,尤其在指针和类的场景中需要特别注意其位置和含义。
2025-08-18 17:45:31
343
原创 C++ 中,花括号 {} 和圆括号 () 用于对象初始化时存在重要区别
特性花括号A a{...};圆括号A a(...);构造函数优先级优先精确匹配普通构造函数窄化转换❌ 禁止✅ 允许解析歧义❌ 无歧义✅ 可能有函数声明歧义聚合初始化✅ 支持❌ C++20 前不支持空初始化✅ 值初始化❌ 函数声明陷阱explicit构造函数✅ 支持✅ 支持防止意外类型转换✅ 更安全⚠️ 较弱。
2025-08-16 16:53:28
262
原创 C++中的引示调用和显示调用
特性隐式调用显式调用触发方式编译器自动插入程序员手动编写代码代码可见性无直接调用代码有明确的调用语句(如func()典型场景构造/析构、类型转换、运算符重载普通函数调用、手动资源管理控制权由编译器控制由程序员控制explicit关键字用于禁止隐式转换(如不适用。
2025-08-16 16:30:19
311
原创 函数指针和指针函数
特性指针函数函数指针本质函数(返回指针)指针(指向函数)声明格式操作符函数调用运算符()指针解引用(可选)内存占用函数代码段指针大小(通常4/8字节)典型用途返回动态分配的内存回调函数、策略模式赋值操作定义函数实现指向已有函数高级用法:函数指针数组// 函数指针数组示例(计算器核心)add, // 索引0:加法sub, // 索引1:减法[3] = NULL // 索引3:空指针// 加法// 输出:11。
2025-08-04 10:40:12
241
原创 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
231
原创 C语言 内存管理方法
动态内存空间在操作系统的堆区中,我们平常在定义变量或数组的时候都属于局部变量和局部数组,这些局部变量和局部数组都存储在操作系统的栈区里面,想要了解栈区,我们就要知道线程和进程操作系统分配资源的最基本单位是进程,当我们运行自己程序的时候对于操作系统来说就是开启了一个进程,然后我们所有申请的空间(函数里面开辟的局部变量,动态申请内存)都会分配到当前的这个进程CPU计算的最基本单位是线程多线程程序。
2024-12-10 15:18:45
2103
原创 C语言之sizeof
在 C 语言中,sizeof是一个(而不是函数),用于获取一个变量或数据类型所占用的内存字节数。它在编译时就会被计算,因此是一个,不会在程序运行时产生开销。
2024-12-10 11:33:18
1269
原创 指针 p1 与 *p1
p1:指针变量,表示存储的地址。*p1:通过指针访问的值,即p1所指向地址存储的值(这里是n的值)。程序中部分输出类型可能需要修正,比如地址打印用%p,整数打印用%d,否则会有不匹配的警告或错误。
2024-12-09 21:25:07
333
原创 字符数组和字符串数组的区别
是一个存储单个字符的数组。本质:一个包含char类型的多个元素的数组,可以用来存储字符数据,也可以用来存储字符串(如果包含字符串结束符'\0'是一个存储多个字符串的数组。本质:一个二维数组,每行存储一个字符串,或者一个指针数组,每个指针指向一个字符串的首地址。字符数组:用来存储单个字符串。字符串数组:用来存储多个字符串,可以用二维字符数组或字符指针数组实现。
2024-11-28 20:37:39
669
1
原创 字符串与数组的运用和存储(简单&易懂版)
arr是数组的名称,传递给scanf时被视为指向数组首元素的指针。的作用是从标准输入中读取一个字符串,并存储到arr中。不用arr[]是因为在调用时,数组已经自动退化为指针,只需传递数组的名称即可。
2024-11-28 20:34:06
294
原创 Visual Studio 2022 编译错误 C4996(改进版)
【代码】Visual Studio 2022 编译错误 C4996(改进版)
2024-09-18 16:36:51
928
原创 针对Visual Studio 2022 找不到指定文件 C4996的解决方法
可能是你的代码使用标记为“已弃用”的函数、类成员、变量或 typedef。符号是使用修饰符或 C++14属性弃用的。实际的 C4996 警告消息由声明的deprecated修饰符或属性指定。
2023-10-23 08:55:08
380
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人