所谓“特殊类”,通常是指对对象创建位置、复制能力、继承关系或实例数量施加约束的类。例如:只能通过工厂创建、禁止复制、禁止继承,或者整个进程只允许存在一个实例。
这些设计题看起来是在考构造函数、operator new、= delete、final 和静态成员,实质上考查的是对象生命周期、访问控制、所有权、并发安全与接口约束。本文按照常见面试题逐一分析,并说明 ...
C++ 允许程序员直接管理内存,这带来了精确控制能力,也带来了内存泄漏、重复释放、悬空指针和异常安全等问题。智能指针的核心价值,不是把裸指针换一个名字,而是用对象生命周期表达资源所有权,并通过 RAII 自动完成释放。
本文从内存泄漏与 RAII 出发,系统讲解 std::unique_ptr、std::shared_ptr、std::weak_ptr 的使 ...
C++ 异常是一套用于报告和处理运行期错误的机制。它把“发现错误”与“处理错误”分离:底层函数负责发现问题并抛出异常,上层调用者根据异常类型决定如何恢复、记录或终止操作。
异常本身并不复杂,真正需要掌握的是异常传播、栈展开、资源释放、异常安全保证以及工程中的使用边界。本文从传统错误处理方式讲起,系统梳理 throw、try、catch、重新抛出、自定义异常、 ...
前言C++11 是现代 C++ 的重要起点。它并不是简单增加几个语法糖,而是从语言表达能力、资源管理、泛型编程和并发支持等方面系统地改造了 C++。
与 C++98/03 相比,C++11 的重要变化包括:
统一的列表初始化;
auto 与 decltype 类型推导;
范围 for 循环;
nullptr、constexpr 和 static_ ...
前言C 语言是一门结构化程序设计语言。一个程序无论多么复杂,基本执行流程都可以由三种结构组合而成:
顺序结构:语句按照书写顺序依次执行;
选择结构:根据条件选择不同分支;
循环结构:在条件满足时重复执行一段代码。
C 语言使用 if 和 switch 实现选择结构,使用 while、for 和 do...while 实现循环结构,并通过 break、co ...
前言vector、list 和 deque 等容器主要按照元素的位置组织数据,属于序列式容器。map 和 set 则按照关键字组织数据,能够根据关键字快速完成查找、插入和删除,属于关联式容器。
本文将从 pair 开始,依次介绍 set、map、multiset 和 multimap 的使用,并继续分析它们与二叉搜索树、AVL 树和红黑树之间的关系。
本文主 ...
前言在前面的关联式容器中,map 和 set 通常借助红黑树组织数据,查找、插入和删除的时间复杂度为 O(log n),并且能够保持关键字有序。
C++11 又引入了一组无序关联式容器:
std::unordered_map;
std::unordered_set;
std::unordered_multimap;
std::unordered_multi ...
前言C 语言的基础语法并不复杂,但初学阶段有很多概念非常容易混淆:
编译器和 IDE 是一回事吗?
.c 文件如何变成可执行程序?
一个工程为什么只能有一个 main 函数?
字符 'a' 和字符串 "a" 有什么区别?
字符串末尾为什么必须有 '\0'?
sizeof("abc") ...
前言程序处理的每一份数据都有类型。类型不仅决定一段数据叫什么,更决定:
需要多少存储空间;
可以表示怎样的值;
数据在内存中如何解释;
可以参与哪些运算;
输入和输出时应使用什么格式。
例如,int 通常用来保存整数,double 用来保存带小数的数据,char 用来保存字符编码。即使内存中的若干位完全相同,使用不同类型解释,也可能得到不同结果。
本文围 ...
前言提到《庄子》,很多人首先想到的是鲲鹏展翅、庄周梦蝶、庖丁解牛和相濡以沫。这些故事想象瑰丽、语言奇诡,看起来彼此独立,背后却共同讨论着一个问题:
当世界充满限制、冲突、评价和变化时,一个人应该如何安顿自己的生命?
《庄子》现存三十三篇,传统上分为:
内篇七篇;
外篇十五篇;
杂篇十一篇。
内七篇通常被视为最接近庄子核心思想的部分,包括:
《逍遥游 ...
