自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(530)
  • 资源 (1)
  • 收藏
  • 关注

原创 详解C++设计模式编程中策略模式的优缺点及实现

策略模式(strategy pattern)把一组可以互换的算法分别封装成类,让它们实现同一个接口,客户端在运行时选择使用哪一个。它的典型结构是:一个策略接口、若干具体策略、一个持有策略的上下文对象。上下文把具体的计算委托给策略,自己只负责流程。常见误解有三个。第一,认为策略模式就是「把 if-else 换成类」,于是为每个分支建一个类,代码量翻倍却没有获得任何好处。第二,认为它一定优于条件分支。策略模式解决的是「算法需要独立变化、需要在运行时切换、需要单独测试」的问题;

2026-11-08 02:52:15 1

原创 详解C++编程中表达式的语义与计算顺序

表达式的计算顺序」是 C++ 里最容易被想当然的部分。很多人默认「代码从左到右执行」,于是写出并期待f一定先于g被调用,或者写出a[i] = i++并认为结果是可预测的。在 C++17 之前,这些假设大多不成立;即使在 C++17 之后,也只是其中一部分被明确规定,另一部分仍然是「未指定顺序」。这里要区分三个容易混淆的概念。未定义行为(undefined behavior, UB)是指标准不施加任何要求,程序可能崩溃、可能给出错误结果、也可能看起来正常;未指定行为。

2026-11-08 02:51:23 1

原创 详解C++编程中类模板的相关使用知识

std::map全都是类模板。它的基本语法只要几分钟就能学会,但真正写起来,坑集中在三个地方——类外定义成员函数时要重复的模板头依赖名(dependent name)的查找与typenametemplate关键字、以及模板定义必须对实例化点可见。最常见的误解是「模板就是一种代码生成器,编译器见到就会生成所有代码」。实际情况是:类模板本身不是类型,它是一份「配方」;编译器在你真正写出具体参数(比如Box<int>)时才生成代码,这个过程叫实例化(instantiation)。而且默认的隐式实例化。

2026-11-08 02:50:22 1

原创 详解C++编程中的单目运算符重载与双目运算符重载

它不是「把运算符变成函数」这么简单,而是有一整套语法与语义约束。单目运算符只有一个操作数,双目运算符有两个。同一个符号可能两种身份都有,例如既可以是取负(单目),也可以是减法(双目);编译器根据实际写出的操作数个数选择对应的重载。初学者最常见的误解有三个。第一,以为成员函数和普通函数的参数个数一样——成员函数的左操作数是隐含的this,所以双目运算符的成员版本只写一个显式参数,单目运算符的成员版本不写参数。第二,把前置++和后置++写成同一个签名;C++ 用「后置版本多一个int。

2026-11-08 02:49:27 1

原创 详解C++编程中向函数传递引用参数的用法

C++ 的函数参数有三种常见形式:按值T、按引用T&、按 const 引用const T&。按值传递会拷贝实参,函数内修改的是副本;按引用传递不拷贝,函数内修改会直接作用到调用者的对象;const 引用兼顾「不拷贝」和「只读」。理解这三者的差别,是写出正确且高效接口的基础。常见误解有三个。第一,认为引用参数一定比按值快。对intdouble、指针这类小类型,拷贝的成本本来就很低,传引用反而多了一层间接,代码也更难读。第二,认为const T&能延长临时对象的生命周期到函数返回之后。

2026-11-08 02:48:21

原创 详解C++编程中一元运算符的重载

一元运算符是只接受一个操作数的运算符:取负-a、取正+a、逻辑非!a、按位取反~a、自增++aa++、自减、解引用*p、取地址&a、成员访问p->m。重载它们,就是为自定义类型定义这些符号的行为,让Integer a;-a;这样的写法有意义。重载一元运算符的语法比二元简单,但有几个必须拿准的细节:成员函数不带参数,非成员函数带一个参数;前缀++返回引用,后缀++返回旧值且要多一个int形参;operator-不应修改自身,应该声明为const并返回新对象。

2026-11-08 02:47:27

原创 详解C++的模板中typename关键字的用法

typename是 C++ 里少数几个"纯粹为了消歧义而存在"的关键字。它的全部职责只有一件事:告诉编译器,一个限定名(qualified name)出现在这里时应当被解释成一个类型,而不是一个值。为什么需要它?因为模板在定义时就要被完整解析,而此时模板参数还是未知的。面对这样的写法,编译器不知道T默认把它当成一个非类型(值、静态数据成员或函数)。如果它实际是类型,就必须用typename显式说明。围绕typename的典型误解有三个。第一,以为它和class。

2026-11-08 02:46:29

原创 详解C++标准库中处理正则表达式的类std::regex

std::regex是 C++11 加入标准库的正则表达式组件,定义在<regex>中。它把正则模式的编译、匹配、搜索、替换和遍历封装成一组类模板,让 C++ 不必依赖 POSIX 的regcompregexec或第三方库就能处理文本模式。围绕它有两大类误解。第一类是接口层面的:把当成「在文本中查找」,实际上它要求整个输入都匹配模式,查子串要用。第二类是性能与安全层面的:认为标准库的正则一定足够快、足够安全。实际上标准只规定语义,不规定匹配算法;

2026-11-08 02:45:35

原创 详解C++最小惊讶原则

"这段代码看起来是这个意思,实际却是那个意思"——几乎每一个 C++ 线上事故的复盘报告里,都能找到这句话的变体。一个接口、一个函数、一个运算符的行为,应当符合使用者的直觉预期;当某个设计会产生"意外的副作用"或"违反直觉的结果"时,就是设计出了问题。operator=可能是拷贝也可能是移动,operator[]可能是读取也可能是插入,auto可能推导出引用也可能推导出副本,a = b可能是深拷贝也可能只是指针赋值。

2026-11-08 02:44:44

原创 详解C++文件读写操作

C++ 的文件读写由<fstream>负责读,负责写,既能读也能写。它们都遵循 RAII:对象析构时自动关闭文件,因此绝大多数场景不需要手动调用close()。真正容易出错的不是打开与关闭,而是「文本模式与二进制模式的区别」「循环读取的终止条件」「打开模式之间的相互覆盖」以及「二进制读写只适用于哪些类型」。最常见的误解是用while (!in.eof())作为读取循环的条件。eof()只有在一次读取尝试撞到文件末尾之后才置位,因此循环体会多执行一次,最后一次读到的数据是脏的或重复的。

2026-11-08 02:43:48

原创 详解C++数组和数组名问题(指针、解引用)

数组是 C++ 里最基础也最容易「似懂非懂」的类型。初学者常听到一句话——「数组名就是指向首元素的指针」,于是所有推导都建立在这个前提上。但这个说法只在「大多数表达式」里成立:数组名本身是一个数组类型的对象,只是在参与运算时会发生数组到指针的转换(array-to-pointer conversion),也就是常说的「退化」(decay)。一旦把这层区分忘掉,就会出现几类典型困惑:为什么在主函数里是整个数组的大小,传进函数后却变成一个指针的大小?为什么&arr和arr打印出来地址相同,&arr + 1。

2026-11-08 02:42:55

原创 详解C++实现线程安全的单例模式

单例模式(singleton pattern)保证一个类只有一个实例,并提供全局访问点。它常被用在配置管理、日志器、连接池这类「天生就该只有一份」的对象上。单例的问题不在于「怎么写」,而在于并发下的初始化instance()第一次被多个线程 同时调用时,怎样保证构造函数只执行一次,而且其它线程拿到的一定是已经完全构造好的对象。「双检锁(double-checked locking)加上volatile就是线程安全的」——这是 Java 里的结论。在 C++ 里,volatile。

2026-11-08 02:42:00 51

原创 详解C++实现拓扑排序算法

拓扑排序(topological sort)解决的是「有依赖关系的任务如何排成一个线性序列」的问题:给定一个有向图,要求输出一个顶点序列,使每条有向边u -> v中u都排在v之前。它只对有向无环图(directed acyclic graph, DAG)存在完整解;图中有环时不存在这样的序列,算法应当报告环,而不是给出一个看似合理的顺序。常见误解有两个。第一,以为拓扑排序的结果唯一——实际上通常有多个合法序列,算法的输出取决于入队顺序或遍历顺序。

2026-11-08 02:41:06 70

原创 详解C++实现匈牙利算法

匈牙利算法(Hungarian algorithm)是求二分图最小权完美匹配的经典算法,最常见的应用是「指派问题」:有n个工人和n项任务,第i个工人做第j项任务的代价是cost[i][j],每个工人做一项任务、每项任务由一个工人做,求总代价最小的分配方案。它由 Kuhn 和 Munkres 分别发展,所以也叫 Kuhn–Munkres 算法。常见的误解有三个。第一,把匈牙利算法和「二分图最大匹配的增广路算法」混为一谈。后者(常被称为匈牙利算法的一个版本)求的是最大基数匹配,不涉及权值;

2026-11-08 02:40:10 27

原创 详解C++句柄类

句柄类(handle class)要解决的问题是:让一个对象看起来像值,复制起来很便宜,但内部可以共享一份实现。典型的实现是「句柄 + 本体(body)」两段式:句柄持有指向本体的指针,复制句柄只增加引用计数,真正的大块数据不复制;需要修改时再按需分离,也就是写时复制(copy-on-write, COW)。常见的误解是把句柄等同于裸指针。裸指针没有所有权语义,复制后谁释放、何时释放全靠人工约定;句柄把引用计数和析构逻辑封装起来,复制、赋值、析构都自动维护生命周期。

2026-11-08 02:39:14 107

原创 详解C++函数模板与分离编译模式

"函数模板"和"分离编译模式"这两件事在 C++ 里是互相排斥的。所谓分离编译(separate compilation),指的是把声明放进头文件、把定义放进.cpp,各翻译单元独立编译、最后由链接器拼装起来。这个模式对普通函数完全成立,但对函数模板不成立:如果你照着"声明进.h、定义进.cpp"的惯例去写模板,几乎一定会遇到链接错误。所以本文讲的是"为什么模板写不了分离编译、标准给了哪几条出路"。第二个常见误解是"给模板加上inline就能解决链接问题"。inline影响的是链接期符号的合并规则。

2026-11-08 02:38:18 186

原创 详解C++元编程之Parser Combinator

Parser Combinator(解析器组合子)是一种把「解析器」当作普通值来组合的编程范式:最小的解析器只认识一个字符,复杂解析器由小解析器通过「顺序」「选择」「重复」「映射」等组合子拼出来。它在 Haskell 的 Parsec 库里被发扬光大,核心思想是解析器就是一阶函数,组合子就是高阶函数。这个思路天然适合泛型编程,也很适合拿来讲解 C++ 的模板元编程——因为同一套组合逻辑,既可以在运行期用实现,也可以在编译期用类型和模板特化实现。

2026-11-08 02:37:24 143

原创 详解C++作用域与生命周期

作用域(scope)和生命周期(lifetime)是 C++ 里最容易被混为一谈的一对概念。很多教程把它们放在同一节讲,读者自然会产生"变量出了大括号就没了"的印象。名字的可见性确实在大括号结束处终止,但对象本身是否销毁,取决于它的存储期(storage duration),而不是名字的作用域。举个最直接的例子:函数内的static局部变量,名字只在函数体内可见,对象却一直活到程序结束;

2026-11-08 02:36:32 151

原创 详解C++之C++11的牛逼特性

C++11(ISO/IEC 14882:2011)是 C++98 之后第一个真正意义上的大版本更新。它之前的 C++03 主要是缺陷修复,语言本身变化很小;而 C++11 一次性引入了大量新特性,从语言核心到标准库都发生了明显变化。很多今天看起来理所当然的写法——auto、范围 for、lambda、智能指针、——都是从那一次更新开始进入标准的。围绕 C++11 有两个常见误解。第一,把它当成"某个编译器的新功能"。

2026-11-08 02:35:35 97

原创 详解c++中<iostream>常用接口汇总

iostream>是 C++ 标准库的输入输出流头文件,定义了std::cinstd::coutstd::cerrstd::clog四个标准流对象,以及等类型。日常写代码几乎都会用到它,但真正了解流状态、格式化标志、缓冲区刷新时机的人并不多。常见的误解有三个。第一,以为在输入失败时会抛异常;默认情况下它只是设置流状态位,不抛异常(除非启用了异常掩码)。第二,以为std::endl和'\n'完全等价;std::endl还会刷新缓冲区,对性能有影响。第三,以为能读一整行;它遇到空白就停,读整行要用。

2026-11-08 02:34:41 200

原创 用C/C++扩展你的PHP 为你的php增加功能

PHP 本身是用 C 实现的,所谓「扩展 PHP」,就是写一个动态库,让 Zend 引擎在启动时加载它,并把其中的函数注册进 PHP 的函数表。扩展里可以直接调用 C/C++ 代码、复用已有库,也可以把热点逻辑从 PHP 搬到编译型语言里执行。需要先纠正两个常见说法。第一,「扩展就是一个.so.dll。

2026-11-07 03:26:07 4

原创 用C++面向对象的方式动态加载so的方法

动态加载共享库(Linux 下是.so,macOS 下是.dylib,Windows 下是.dll)让程序可以在运行期决定加载哪个模块,插件系统、驱动适配层、热更新都依赖它。POSIX 提供的四个函数dlopendlsymdlerrordlclose是 C 接口,直接调用会让资源管理散落在各处;用面向对象的方式包一层 RAII(resource acquisition is initialization),才能保证异常路径上也不会泄漏句柄。常见误解有三个。第一,以为dlsym返回的void*

2026-11-07 03:24:45 3

原创 用C++的odeint库求解微分方程

在物理仿真、控制工程和生物动力学里,很多模型最终都会写成初值问题:已知状态随时间的变化率,给定初始状态,求之后每一时刻的状态。这类方程大多数没有可用的解析解,工程上靠数值积分一步步往前推。C++ 标准库没有微分方程求解器,odeint 是 Boost 提供的一个常微分方程(ordinary differential equation, ODE)数值积分库,头文件即可用,接口围绕“状态容器 + 右端函数 + 步进器 + 积分驱动”四件事组织。关于 odeint 有两个常见误解。

2026-11-07 03:23:18

原创 用C++实现一个命令行进度条的示例代码

命令行工具在处理批量任务时,如果没有反馈,用户无法判断程序是在正常工作还是卡死了。进度条要做的就是这件事:用一行不断刷新的文本,告诉用户「已经完成多少、还需要多久」。它不改变程序逻辑,但显著影响工具的可用人性。这个题目下有几点常见误解。第一,认为进度条必须依赖 ncurses 之类的终端库。其实最朴素的版本只用标准库就能实现,核心是回车符\r加输出刷新。第二,认为只要写了\r就会自动刷新。std::cout有缓冲,不flush的话,字符可能一直留在缓冲区里,用户看到的是长时间不动、然后突然跳一大段。

2026-11-07 03:21:51 2

原创 用C++实现DBSCAN聚类算法

DBSCAN(density-based spatial clustering of applications with noise)是一种基于密度的聚类算法。它不需要预先指定簇的个数,能发现任意形状的簇,还能把低密度区域的点标记为噪声。这两点是它相对 k-means 的主要优势。常见误解有三个。第一,以为 DBSCAN 什么数据都能处理好——它对「密度不均匀」的数据很敏感,一个全局eps很难同时适配密集区和稀疏区。第二,以为eps。

2026-11-07 03:20:25 2

原创 源码解析C++20新特性如何简化线程超时取消

在 C++20 之前,标准库没有提供任何「取消一个正在运行的线程」的机制。开发者想让一个阻塞等待的线程在超时后退出,通常只有两条路:一是把sleep_for切成小段反复轮询一个bool标志,二是使用带超时的wait_for,把「超时」当成「取消」来用。前者让线程空转、延迟不可控,后者无法区分「确实超时」和「被要求停止」,而且如果线程正卡在别的地方,超时根本帮不上忙。,以及会自动请求停止并 join 的。同时,增加了接受stop_token的waitwait_forwait_until重载。

2026-11-07 03:18:58 2

原创 深度剖析C++对象池自动回收技术实现

对象池(object pool)要解决的问题是:某类对象会被频繁创建和销毁,而每次newdelete都要进入分配器、可能触发系统调用、还可能造成堆碎片。对象池预先申请一批槽位,创建时复用空闲槽,销毁时不真正归还内存,而是把槽位放回空闲表。所谓「自动回收」,指的是用 RAII 句柄包装对象:句柄析构时自动调用对象析构函数并把槽位还给池,调用方不需要手写release。常见的误解有三个。第一,认为「用了对象池一定更快」。

2026-11-07 03:17:38 1

原创 深入解读C++ 内联函数inline|nullptr

inline是函数说明符,nullptr是 C++11 引入的空指针字面量。它们既不属于同一类语法,也没有替代关系,本文分别讲解,读者可以把它们当作两篇独立的小文章来看。关于inline,最常见的误解是「加上inline编译器就一定会把函数展开,所以一定更快」。inline的主要作用是关于单一定义规则(One Definition Rule, ODR)的链接期约定,是否真正内联由编译器根据函数体大小、调用次数、优化级别自行决定。关于nullptr,常见误解是「它只是NULL的另一种写法」,实际上。

2026-11-07 03:16:12 3

原创 深入解析C++和JAVA的字符串

把 C++ 的和 Java 的String放在一起比较,最容易出现的错误是「用一门语言的心智模型去解释另一门」。两者名字相同,语义却几乎在每个维度上都相反:C++ 的是可变的字节序列,赋值是值语义,拷贝出来就是独立对象;Java 的String是不可变的 UTF-16 码元序列,变量持有的是引用,赋值只是复制引用,内容永远不变。由此衍生出一连串差异:比较方式、子串代价、拼接行为、内存布局、编码含义。常见的误解有四个。第一,以为 C++ 的里存的是「字符」,所以size()

2026-11-07 03:14:44

原创 深入解析C++中的智能指针

智能指针解决的核心问题是所有权:一块动态分配的内存到底由谁负责释放、什么时候释放。裸指针只表达「指向」,不表达「拥有」,于是删除责任只能靠约定和注释维持。一旦控制流提前返回、抛出异常,或者两个模块都以为自己不该释放,泄漏和重复释放就出现了。围绕智能指针,常见的误解有四个。第一,认为「用了智能指针就不会泄漏」。shared_ptr的循环引用恰恰会造成稳定泄漏。第二,认为std::move会移动对象。它只做类型转换,真正的所有权转移由移动构造完成。第三,认为shared_ptr线程安全。它的控制块。

2026-11-07 03:13:20 2

原创 深入解析C++中的字符数组和处理字符串的方法

C++ 里「字符串」至少有四种形态:字符数组、指向字符的指针、、C++17 的。它们看起来都能表示一串字符,但所有权、生命周期、是否以空字符结尾、能否修改,规则各不相同。大量崩溃和乱码就来自把这四者当成同一回事。最常见的误解是「字符数组就是字符串」。字符数组只是一个数组,它可以不包含结尾的'\0',也可以中途就有'\0';只有以'\0'结尾、且后续函数按此约定处理的字节序列,才构成 C 风格字符串。另一个误解是「sizeof。

2026-11-07 03:11:52 5

原创 深入解析C++中的函数模板和函数的默认参数

默认参数」和「函数模板」是两个独立但经常一起出现的语言特性。默认参数让调用方省略尾部实参,函数模板让同一段逻辑适配不同类型。把两者放在一起时,边界规则会变得微妙:默认的函数实参不参与模板实参推导,默认的模板实参则可以补齐无法推导的类型;默认实参不属于函数类型,通过函数指针调用时不会生效;虚函数的默认实参按静态类型选取,而不是按动态类型。常见的误解包括:写之后调用f(),以为T会从0推导出来——实际上推导失败,因为默认函数实参不用于推导;

2026-11-07 03:10:31 61

原创 深入解析C++11 lambda表达式/包装器/线程库

C++11 同时引入了 lambda 表达式、包装器和<thread>线程库,这三者经常一起出现:把一段带捕获的逻辑交给保存,再作为一个任务丢进执行。它们的组合极大地降低了并发编程的入门门槛,但也把「对象生命周期」这个老问题带进了新场景——线程可能在 lambda 捕获的变量销毁之后才真正运行。常见误解有三个。第一,认为 lambda 是「匿名函数」,实际上它是一个闭包对象(closure),捕获的变量是它的成员,operator()是成员函数。第二,认为。

2026-11-07 03:09:08 53

原创 深入理解QT多线程编程

Qt 的多线程设施建立在平台线程之上,但它并不是简单地把包一层。QThread、事件循环、信号与槽的跨线程投递、QObject的线程亲和性(thread affinity)共同构成了一套有自己规则的模型。很多初学者把QThread当成"线程句柄"来用,于是写出"继承QThread,再把耗时逻辑塞进槽函数"的代码,然后发现槽函数根本不在新线程里执行——这是对 Qt 线程模型最典型的误解。另一个常见误解是"用了 Qt 的线程类就不会有数据竞争"。

2026-11-07 03:07:53 79

原创 深入理解C++类和类中的public、protected、private

publicprotectedprivate是 C++ 中最先接触、也最容易被低估的三个关键字。多数教材只给一句「public 谁都能访问,private 只有自己能访问」,然后就进入写代码的环节。结果就是:有人把所有成员都设成 public,把类写成「带成员函数的结构体」;有人以为private是运行期的安全保护;还有人搞不清protected和继承方式组合后到底谁能看见谁。先把几个前提讲清楚。第一,访问控制是编译期的概念,它只约束「名字能不能被使用」,不改变对象布局,也不产生运行期检查;

2026-11-07 03:06:32 158

原创 深入理解C++模板如何实现多态思想

多态」的经典定义是「同一接口,不同实现」。教科书通常用虚函数讲这件事:基类声明,派生类各自覆盖,通过基类指针调用时在运行期查虚表决定走哪个实现。这被称为动态多态但 C++ 还有另一条完全不同的路径:模板在编译期根据实参类型生成不同的代码,只要类型提供了所需的操作,同一段模板代码就能作用于多种类型。这被称为静态多态(static polymorphism),也叫编译期多态。一个常见的误解是「模板只是泛型容器,跟多态没关系」。std::sort对。

2026-11-07 03:05:13 173

原创 深入理解C++内链接与外链接的意义

链接性」(linkage)描述的是一个名字能否被其他翻译单元(translation unit,通常是一个.cpp文件预处理后的结果)引用。外部链接(external linkage)的名字在整个程序里只有一份,链接器会把不同目标文件中的引用解析到同一个实体;内部链接(internal linkage)的名字只在当前翻译单元可见,每个翻译单元各有一份。这个区别解释了许多日常现象:为什么在头文件里定义一个普通函数会导致「multiple definition」;为什么。

2026-11-07 03:03:55 160

原创 深入理解C++之策略模式

策略模式(Strategy Pattern)要解决的问题很具体:一个类的主要流程固定,但其中某一步算法可能有多种实现,并且需要在运行期切换。把这一步抽成独立的对象,让上下文持有一个策略接口,具体算法由派生类实现,上下文只负责调用。这样新增算法不需要修改上下文,符合开闭原则。常见的误解有两个。第一,以为策略模式就是"用虚函数替代 if-else",于是把任何分支都套上继承体系,结果类数量爆炸、调用链变长,反而不如一个switch清楚。第二,以为策略必须通过继承实现。现代 C++ 至少有三条路:虚函数、

2026-11-07 03:02:33 154

原创 深入理解C++中的thread_local线程局部变量的应用

多线程编程里最贵的东西不是 CPU,而是同步。一把互斥锁(mutex)在无竞争时大约几十纳秒,一旦发生竞争,代价就是微秒级甚至毫秒级的上下文切换。而很多被锁保护的数据,本质上根本不需要共享——每个线程各要一份就够了。(C++11 引入)就是为这类数据准备的存储期说明符(storage duration specifier)。它让每个线程拥有该变量的独立实例,生命周期与线程绑定,访问它不需要任何同步。

2026-11-07 03:01:15 155

原创 深入理解C++中变量的存储类别和属性

autoregisterstaticextern四个说明符决定变量的存储期与链接属性。auto在 C++11 变成了类型推导占位符,register在 C++17 被移除,C++11 又新增了,而mutable从来就不是存储类别说明符,它是成员变量上的修饰符。把这些概念混在一起,是初学者最常见的误解来源。本文按「存储期(storage duration)」「链接(linkage)」「作用域(scope)」三条线重新梳理,再单独讲 C++11 起的属性(attribute)语法。

2026-11-07 02:59:53 139

陶哲轩实分析

陶哲轩实分析 良心推荐 正版高清

2015-11-09

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除