- 博客(18)
- 收藏
- 关注
原创 【c++】智能指针工厂函数
C++11 引入的可变模板参数(也叫 “参数包”),允许模板接收任意数量、任意类型的模板参数,语法上用...模板参数包:class... Args(也可以写),表示 “一个包含 0 个或多个类型的参数包”,Args是参数包的名字。,表示 “一个包含 0 个或多个对应类型的函数参数包”,与模板参数包Args一一对应。简单说,...在这里的作用是 “打包”—— 将任意数量的参数打包成一个参数包,后续需要时再用...“解包”。可变模板参数(:解决了 “接收任意数量、任意类型构造参数” 的问题,适配T。
2026-01-29 00:03:04
608
原创 【c++】智能指针
底层核心思想:三大智能指针均基于RAII 机制,在析构时自动释放资源,避免手动delete;差异的核心是所有权管理方式。unique_ptr 底层:独占所有权,栈上封装对象指针 + 删除器,无额外开销,禁用拷贝、支持移动,析构直接释放对象。shared_ptr 底层:共享所有权,依赖堆上控制块存储引用计数,拷贝递增强引用、析构递减强引用,最后一个释放对象,存在循环引用和额外开销问题。weak_ptr 底层:无所有权,共享 shared_ptr 的控制块,仅跟踪弱引用计数,通过lock()
2026-01-29 00:02:48
616
原创 【c++】【stl】std::allocator(vector 默认分配器)
内存池优化:频繁小内存分配(比如 vector 频繁扩容)时,内存池可减少new/delete的系统调用开销;对齐要求:某些硬件 / 算法要求内存按 16/32 字节对齐,仅保证基本对齐;调试 / 统计:自定义分配器可统计内存分配次数、大小,排查内存泄漏;共享内存:分配器可从共享内存区域分配内存,实现进程间数据共享。std::allocator 核心职责:分离 “内存分配 / 释放” 和 “元素构造 / 析构”,vector 的所有内存操作都通过它完成;核心接口:处理原始内存(底层。
2026-01-28 04:16:39
672
原创 【c++】【STL】std::vector
核心本质:动态连续数组,兼具数组的随机访问效率和动态扩容的灵活性;核心概念size():已用元素个数,capacity():总容量;reserve(n):预分配容量(不构造元素),resize(n):调整大小(构造 / 析构元素);扩容规则:默认 2 倍扩容,扩容时元素拷贝 / 移动,迭代器失效;关键操作(拷贝)/(直接构造);pop_back()(尾部)/erase()(指定位置);遍历:迭代器、范围 for、[];性能优化:提前reserve避免扩容,优先,批量操作;避坑重点。
2026-01-28 03:51:44
617
原创 【c++】流(Stream)全解析:从 iostream 到输入输出核心
C++ 支持给自定义类重载<<(输出)和>>(输入)运算符,让自定义类型也能像内置类型一样用流操作。流的本质:数据传输的抽象,分为输入流(读)和输出流(写),接口统一且类型安全;iostream 核心cincout:标准输入输出,>><<是核心操作符;getline:读取带空格的整行字符串;good()eof()fail()检测流的健康度,clear()重置状态;进阶流sstream:内存字符串的读写,适合字符串 / 数值转换、字符串拆分;fstream:文件的读写,用法和标准流一致;
2026-01-27 17:13:00
603
原创 【c++】std::string
核心优势:自动内存管理、SSO 性能优化、丰富的操作接口、类型安全;核心概念size()(实际长度)、capacity()(总容量)、npos(无效位置)、SSO(小字符串优化);关键操作:元素访问([]/at())、查找(find)、替换(replace)、子串(substr)、数值转换(避坑重点:迭代器失效、npos 类型匹配、c_str () 生命周期、越界访问;性能优化:提前reserve()避免扩容、使用移动语义减少拷贝、优先用+=而非拼接。
2026-01-26 22:58:17
601
原创 【c++】模板元编程
什么是 模板元编程(Template Metaprogramming, TMP)?。一、先搞懂:模板元编程的核心本质常规 C++ 代码是 “运行期执行”(比如int a=1+2;在程序运行时计算),而模板元编程是 “编译期执行”—— 编译器在处理模板时,会像 “解释器” 一样,执行你写的模板逻辑,最终生成一个 “确定的结果 / 类型”,运行期只需要直接用这个结果。二、模板元编程的核心特点(和常规编程对比)模板元编程和常规编程有几大核心区别:三、模板元编程的例子。
2026-01-20 00:01:52
653
原创 【c++】异常处理
我们在 throw 的时候虽然可以填写任意数据,但是为了标准化,C++标准库提供了异常家族,祖宗是std::exception 所以必须包含 #include<exception> 这个头文件。
2026-01-17 16:30:07
650
原创 【c++】嵌套和继承的区别
嵌套类是 “内部组件”,作用是封装和内聚,把强相关的逻辑藏在外部类内部,避免命名冲突,适合 “XX 是 XX 的一部分” 的场景;继承是 “父子派生”,作用是复用和扩展,子类复用父类的所有功能,同时扩展自己的特性,适合 “XX 是 XX 的一种” 的场景。
2026-01-16 22:26:03
48
原创 【c++】static的作用
修饰类的成员核心是让成员 “属于类本身,而非具体对象”,所有对象共享这一份资源。static 修饰全局变量 / 函数时,核心作用是。示例 2:静态常量(类级别的只读全局值)static 修饰局部变量时,核心作用是。示例 1:静态成员变量(统计对象数量)(仅初始化 1 次,函数结束不销毁)。(最常用:静态成员变量 / 函数)三、修饰全局变量 / 普通函数。(避免多文件命名冲突)。static 的作用是。
2026-01-16 18:51:39
90
原创 【c++】移动构造函数
相比于拷贝构造更加高效,全程没有内存分配、没有数据拷贝,只做指针赋值,效率接近 O (1)。1. 对于有动态资源的类,编译器生成的默认移动构造 / 赋值是 “偷懒的浅转移”—— 只做。1. 默认构造函数,2. 析构函数,3. 拷贝构造函数,4. 拷贝赋值运算符。既然编译器会自动生成移动拷贝和移动赋值运算符,为什么我们还要手动写?尤其是大对象的时候,拷贝构造函数的效率完全比不上移动构造。2.手动写移动构造的核心价值:实现 “安全的资源转移”),编译器生成的默认移动函数足够用,无需手动写。
2026-01-15 20:24:55
533
原创 【c++】const的作用
最基础的用法,核心是让变量 / 对象变成 “只读”,一旦初始化就不能被赋值修改,编译器会检查并阻止任何修改操作,避免意外篡改。—— 用来限定变量 / 函数 / 指针等 “不能被修改”,既能提升代码安全性,也能增强可读性。:约束对象的 “只读属性”,确保对象状态不会被意外修改,是类设计中 “只读接口” 的基础。之前写了const在函数当中的作用,那就在写一下const的其他作用,帮助自己理解。const 是 C++ 里最基础也最关键的关键字之一,核心是。,表示函数不会修改字符串内容,提升代码安全性。
2026-01-14 23:59:46
648
原创 【c++】拷贝构造函数中的深拷贝和浅拷贝
在这里我们将other的size给到新对象的size,通过std::copy将原对象other的数组内容完整复制到新分配的内存中。这行代码,本质是:把 other.data 指向的数组中,从起始位置到 size 个元素的所有数据,拷贝到 data 指向的内存地址开始的位置。综上所述,std::copy是比较通用且适配所有类型的,同时标准库有一定优化,其他都是按需选择。它只拷贝字节,对自定义对象中的指针,仅复制指针的地址值,不拷贝指针指向的内容,因此是浅拷贝;(或拷贝构造),就能实现真正的深拷贝;
2026-01-14 23:31:25
681
原创 【c++】const加在函数的作用
函数末尾的const:修饰的是(限制this指针),表示函数不修改对象状态。这个const是用来修饰thismutableconst。成员函数的本质是隐含了一个this指针参数(比如getValue实际是),加了末尾的const后,this指针变成constconst函数前面的const:修饰的是,表示返回值是一个常量,不能被修改(仅对引用 / 指针返回值有实际意义);
2026-01-13 23:32:10
412
原创 【c++】拷贝构造函数为什么必须用引用传参
(包括拷贝构造、带参构造、无参构造)。一旦你自定义了拷贝构造函数,编译器就不会再自动生成无参 / 默认构造函数了。好的让我们回来理解一下为什么要加&?
2026-01-13 23:05:48
366
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅