C++——从入门到出门
文章平均质量分 84
🈚️
凉茶钱
就当看个乐子
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
继承:从 is-a 分界线到菱形继承的独木桥
继承通过抽取公共成员与行为实现代码复用,避免重复。判断是否使用继承应遵循“is-a”原则:若“X是一个Y”成立则用继承,否则用组合(has-a)。C++中默认class为私有继承,易引发访问问题,故继承方式必须显式声明。三种继承方式影响成员访问权限,protected专为派生类设计,private成员虽不可见但被继承并占用内存。构造顺序为先基类后派生类,析构则相反,由语言自动保证。原创 2026-10-24 17:11:15 · 120 阅读 · 7 评论 -
模板进阶:编译期代码生成、三类参数、特化与分离编译
把模板定义连声明一起写进Func.hFunc.cpp// 方案二:定义直接放头文件。包含它的编译单元在编译期自己实例化,// 不需要链接器去别处找地址——这就是模板普遍写在头文件里的原因#endif每个包含这份头文件的编译单元,在用到的地方自己实例化,用什么类型现场生成什么,链接器再把多个编译单元生成的同名实例去重合并。“去重”这件事同样可以实测。两个.cpp各自调用两个目标文件各带一份,符号名完全相同(,名字修饰里编进了模板实参Ii即 int);原创 2026-10-24 16:38:38 · 329 阅读 · 12 评论 -
stack、queue、priority_queue、容器适配器完整梳理
容器适配器通过组合方式,为底层容器(如deque、vector)提供受限访问接口,实现栈(stack)、队列(queue)和优先队列(priority_queue)的语义。其核心是“不改变数据存储,仅封装操作”,通过模板参数灵活指定底层容器与比较策略(仿函数),确保接口安全与功能独立。栈遵循后进先出,队列实现先进先出,优先队列则基于堆结构与自定义比较规则,体现“策略分离”设计思想。原创 2026-10-24 16:37:37 · 427 阅读 · 18 评论 -
list:哨兵节点,const_iterator 和 const iterator的区别与迭代器失效
编号坑现象根因处理1不写拷贝构造两个对象共用一条链,析构时 heap-use-after-free默认拷贝构造逐成员复制,_head指针被抄了一份深拷贝:建自己的哨兵,逐个push_back2析构函数留空节点全泄漏,元素的析构函数一次都没执行只或不写析构,数据节点无人回收clear()后再3用当 const 迭代器const修饰的是迭代器自身,++被禁单独写一个4缺iterator到的转换两个独立类型之间没有转换路径补一个接的构造5const 迭代器后置++写错类型。原创 2026-10-19 12:31:02 · 136 阅读 · 3 评论 -
list:哨兵位、双向链接与迭代器失效
int 版本那 24 字节的构成值得算一遍:数据 4 字节,为了让后面两个指针按 8 字节对齐,编译器补 4 字节空洞,再加两个 8 字节指针,正好 24。第一,节点怎么连成一个整体。它的价值是"没有半成品状态":任何一处忘记赋值的地方,表现出来是空指针崩溃,而不是指向随机地址的野指针——后者调试成本高一个量级。这是链表和 vector 最本质的差别:vector 的插入是搬家,list 的插入是接线。复盘顺序按"对象从生到死"排:先看节点和迭代器,再看构造与哨兵初始化,然后是增删改,最后是析构与赋值。原创 2026-10-18 15:33:39 · 544 阅读 · 37 评论 -
vector:三个指针、容量语义与扩容的真实成本
本文系统解析了vector容器的核心机制:基于三指针模型(_start, _finish, _endofstorage)实现动态内存管理,通过左闭右开区间简化逻辑。关键概念包括:size为逻辑长度、capacity为物理容量,二者通过指针相减获得;扩容时需先申请新内存、拷贝元素、释放旧内存,确保深拷贝与迭代器失效处理;容量只增不减,reserve与resize分工明确。均摊时间复杂度为O(1),但扩容成本为O(n)。理解元素生命周期与指针语义是正确实现的关键。原创 2026-10-18 15:32:31 · 335 阅读 · 24 评论 -
【C++】string类模拟实现
本文实现了一个自定义string类,包含成员变量_str、_size、_capacity及静态常量npos,并封装了默认成员函数(构造、析构、拷贝构造、赋值重载)、成员函数(如c_str、size、reserve、push_back、append、insert、erase、find、substr、clear、swap)和运算符重载(如[]、+=、<<、>>、<、<=、>、>=、==、!=)。通过深拷贝确保内存安全,支持迭代器遍历,具备异常安全与高效扩容机制,完原创 2026-10-11 17:18:45 · 417 阅读 · 41 评论 -
【C++】string 常用函数详解
C++的std::string是标准库提供的字符串类,封装字符序列并自动管理内存,支持构造、赋值、遍历、容量操作及字符串修改等丰富接口。其常用成员函数包括size()、length()、capacity()、empty()、clear()、reserve()、resize()等,用于管理字符串长度与空间。支持operator[]、迭代器(begin/end、rbegin/rend)及范围for遍历,便于元素访问与修改。字符串操作如push_back、append、+=、substr、find、c_str等实原创 2026-10-05 23:21:18 · 527 阅读 · 51 评论 -
【C++】泛型编程详解:函数模板与类模板全梳理
本文系统介绍了C++泛型编程中的函数模板与类模板。函数模板通过template<typename T>定义通用代码,编译器根据实参自动实例化对应类型函数,支持隐式和显式实例化,实现类型无关的代码复用。类模板则允许定义可适配多种类型的类,如栈容器,成员函数需在类外重新声明模板。两者均在编译期完成实例化,效率高,是STL等标准库的核心基础。原创 2026-09-30 12:11:09 · 201 阅读 · 9 评论 -
【C++】动态内存管理完整解析:从内存划分到 new delete 底层原理
本文系统梳理了C/C++内存管理机制,涵盖内存分区(栈、堆、静态区、常量区等)、动态内存管理方式及new/delete与malloc/free的差异。重点解析了new/delete在内置类型和自定义类型上的使用原理,强调其自动调用构造/析构函数的特性;介绍了operatornew/operatordelete底层实现及定位new的应用场景,如内存池优化。最后对比了malloc/free与new/delete在语法、异常处理、类型支持等方面的区别,指出正确配对使用的重要性,避免内存泄漏与野指针问题。原创 2026-09-29 21:33:13 · 311 阅读 · 45 评论 -
【C++】Date类的实现
本文详细介绍了自定义Date类的实现,包含私有成员变量(年、月、日)、构造函数及日期合法性校验。通过重载比较运算符(如>、==等),实现日期大小比较,并利用复用机制减少代码冗余。支持加减天数、前置/后置++/--运算,以及日期相减计算天数差。所有函数均考虑效率与安全性,如使用引用传参、const修饰保证不变性,结合GetMonthDay处理闰年二月,确保日期操作正确可靠。原创 2026-09-28 18:05:51 · 523 阅读 · 15 评论 -
【C++】入门基础语法
命名空间用于隔离标识符,解决命名冲突,支持嵌套与分段定义,编译期生效且不占内存。可通过作用域限定、using声明或using指令访问成员,但避免在头文件中使用using namespace。C++输入输出基于流对象(如cin、cout),自动识别类型,支持链式调用,可重载运算符以处理自定义类型。缺省参数简化调用,需从右向左连续设置,不可与重载混用。函数重载通过参数列表区分,返回值不同不构成重载。引用是变量别名,共用内存,提升效率并支持修改实参,但不能绑定临时对象(除非为const引用)。指针与引用区别在于内原创 2026-09-27 21:52:38 · 539 阅读 · 11 评论 -
【C++】static、友元、内部类、匿名对象与拷贝编译器优化全解析
本文系统阐述C++中const与static成员的初始化机制,强调const成员需在构造函数初始化列表中赋值,而static成员须在类外定义并初始化,且所有对象共享。友元机制允许外部函数或类访问私有成员,但破坏封装性,应谨慎使用。内部类作为外部类的作用域成员,可访问其所有成员,但外部类需通过对象访问内部类。匿名对象生命周期短暂,仅存在于创建语句中,适用于临时操作。最后,编译器优化(如RVO/NRVO)可省略拷贝构造,提升性能,尤其在返回局部对象时效果显著。原创 2026-09-27 20:46:33 · 348 阅读 · 18 评论 -
【C++】万字解析类和对象
main 函数并不会直接去调用 Time 类的析构函数,我们要释放的本质是 Date 对象,编译器会调用 Date 类的析构函数,这里我们没有手写 Date 的析构,编译器就自动生成 Date 的默认析构函数,这个默认析构内部会自动调用成员_t(Time 对象)的析构函数,保证 Date 对象内部所有自定义类型成员都能够正确完成销毁。this 指针是编译器提供的隐藏工具,每一个非静态的成员函数,编译器都会自动增加一个隐藏形参,这个形参就是 this 指针,它保存着调用该成员函数的对象地址。原创 2026-09-27 18:24:23 · 549 阅读 · 22 评论
分享