C++实战笔记
文章平均质量分 95
C++实战笔记
_Rye_
左手代码右手诗
一行代码一行诗
展开
-
轻松话题(三) | 提高生活质量的App
今天这期“轻松话题”,想换个领域,跟你聊聊手机,谈谈怎么才能利用好手里的这块小屏幕。推荐几个不是那么常见但却非常有意思的 App,用好它们的话,肯定可以解决你生活中的一些不大不小的麻烦,提升你的生活质量。需要注意的是,下面要说的都是 iPhone 上的应用,不过 Android 上应该也有相同或者相似的产品,请善用各大应用商店的搜索功能。原创 2024-04-07 16:34:24 · 598 阅读 · 0 评论 -
轻松话题(二) | 给你分享我的工作百宝箱
今天,再来说点 C++ 之外的话题。我来聊聊工作方式,介绍一下用的开发环境,有快捷键、配置脚本、常用命令什么的。算不上什么“高效技巧”,但是也能从小处提高工作效率,希望能给你一点借鉴。原创 2024-04-07 16:15:15 · 947 阅读 · 0 评论 -
轻松话题(一) | 4本值得一读再读的经典好书
著名的文学家高尔基说过一句名言:“书籍是人类进步的阶梯。利用碎片时间学习固然很重要,但静下心来认真地读书却更加重要,它能够让你去主动思考、主动探索,更系统、更完整、更深入地获取知识。为了能够让你在工作之余充充电,提高一下自己,今天我就暂且岔开话题,不讲 C++ 语言,而是开列一个清单,精选出几本我认为值得一读再读的技术类好书。顺便说一句,“读书”最好是看纸质实体书,而不是电子版。原创 2024-04-07 15:16:52 · 501 阅读 · 0 评论 -
22 | 知识串讲(下):带你开发一个书店应用
首先,我们来看一下怎么表示书本的销售记录。这里用的是 SalesData 类,它是书店程序数据统计的基础。如果是实际的项目,SalesData 会很复杂,因为一本书的相关信息有很多。但是,我们的这个例子只是演示,所以就简化了一些,基本的成员只有三个:ID 号、销售册数和销售金额。上节课,在讲自旋锁、配置文件等类时,我只是重点说了说代码内部逻辑,没有完整地细说,到底该怎么应用前面讲过的那些 C++ 编码准则。那么,这次在定义 SalesData 类的时候,我就集中归纳一下。原创 2024-04-07 14:29:17 · 672 阅读 · 0 评论 -
21 | 知识串讲(上):带你开发一个书店应用
到今天为止,课程里的 C++ 知识就全部讲完了。前面我们总共学习了四大模块,再做一个简略的回顾。在“概论”单元,我带你从宏观的层面上重新认识了 C++,讲了它的四个生命周期和五个编程范式,分别介绍了在编码阶段、预处理阶段、编译阶段,C++ 能够做哪些事情,接着又重点说了在 C++ 里,运用哪些特性才能更好地实践面向对象编程。在“语言特性”单元,我们一起研究了自动类型推导、常量、智能指针、异常、函数式编程这五个特性。原创 2024-04-07 11:47:57 · 848 阅读 · 0 评论 -
20 | 设计模式(下):C++是怎么应用设计模式的?
上节课谈了设计模式和设计原则。今天,就具体说说,在 C++ 里,该怎么应用单件、工厂、适配器、代理、职责链等这些经典的设计模式,用到的有 call_once()、make_unique()、async() 等 C++ 工具,希望能够给你一些在实际编码时的启发。(在接下来学的时候,你也可以同时思考一下它们都符合哪些设计原则,把设计模式和设计原则结合起来学习。原创 2024-04-07 11:12:16 · 554 阅读 · 0 评论 -
19 | 设计模式(上):C++与设计模式有啥关系?
说白了,大概就是“解耦”吧。模板方法模式可以算是比较明显的依赖反转的例子,父类定义主要的操作步骤,子类必须遵照这些步骤去实现具体的功能。如果单从“解耦”的角度来理解的话,存在上下级调用关系的设计模式都可以算成是依赖反转,比如抽象工厂、桥接、适配器。除了 SOLID 这五个之外,我觉得还有两个比较有用:DRY(Don’t Repeate Yourself)和 KISS(Keep It Simple Stupid)。原创 2024-04-07 10:01:30 · 838 阅读 · 0 评论 -
18 | 性能分析:找出程序的瓶颈
今天是“技能进阶”单元的最后一节课,也要兑现刚开始在“概论”里的承诺,讲一讲在运行阶段我们能做什么。原创 2024-04-07 08:59:03 · 546 阅读 · 0 评论 -
17 | 脚本语言:搭建高性能的混合系统
经过了前面这么多节课的学习,相信你已经认识到了 C++ 的高效、灵活和强大。使用现代特性,再加上标准库和第三方库,C++ 几乎“无所不能”。但是,C++ 也有自己的“阿喀琉斯之踵”,那就是语言复杂、学习曲线陡峭、开发周期长、排错 / 维护成本高。所以,C++ 不能完全适应现在的快速开发和迭代的节奏,最终只能退到后端、底层等领域。要想充分发挥 C++ 的功力,就要辅助其他的语言搭建混合系统,尽量扬长避短,做好那最关键、最核心的部分,这样才能展现出它应有的价值。原创 2024-04-04 12:17:57 · 627 阅读 · 0 评论 -
16 | 网络通信:我不想写原生Socket
在上一节课,讲了 JSON、MessagePack 和 ProtoBuffer 这三种数据交换格式。现在,我们手里有了这些跨语言、跨平台的通用数据,该怎么与外部通信交换呢?你肯定首先想到的就是 Socket 网络编程,使用 TCP/IP 协议栈收发数据,这样不仅可以在本地的进程间通信,也可以在主机、机房之间异地通信。大方向上这是没错的,但你也肯定知道,原生的 Socket API 非常底层,要考虑很多细节,比如 TIME_WAIT、CLOSE_WAIT、REUSEADDR 等,如果再加上异步就更复杂了。原创 2024-04-03 18:20:20 · 809 阅读 · 0 评论 -
15 | 序列化:简单通用的数据交换格式有哪些?
在前面的三个单元里,我们学习了 C++ 的语言特性和标准库,算是把 C++ 的编程范式、生命周期、核心特性、标准库的内容整体过了一遍。从今天起,我们的学习之旅又将开启一个新的篇章。C++ 语言和标准库很强大,功能灵活,组件繁多,但也只能说是构建软件这座大厦的基石。想要仅凭它们去“包打天下”,不能说是绝对不可行,但至少是“吃力难讨好”。还是那句老话:“不要重复发明轮子。原创 2024-04-03 17:54:55 · 863 阅读 · 0 评论 -
14 | 十面埋伏的并发:多线程真的很难吗?
今天,我们来聊聊“并发”(Concurrency)、“多线程”(multithreading)。在 20 年前,大多数人(当然也包括我)对这两个词还是十分陌生的。那个时候,CPU 的性能不高,要做的事情也比较少,没什么并发的需求,简单的单进程、单线程就能够解决大多数问题。但到了现在,计算机硬件飞速发展,不仅主频上 G,还有了多核心,运算能力大幅度提升,只使用单线程很难“喂饱”CPU。而且,随着互联网、大数据、音频视频处理等新需求的不断涌现,运算量也越来越大。原创 2024-04-03 17:17:54 · 925 阅读 · 0 评论 -
13 | 五花八门的算法:不要再手写for循环了
的 lambda 表达式,算法的形式就和普通循环非常接近了,所以刚刚说的也就不再是什么问题了。原创 2024-04-03 17:16:13 · 678 阅读 · 0 评论 -
12 | 三分天下的容器:恰当选择,事半功倍
今天要讲的是标准库里的一块“重地”:容器,它也是 C++ 泛型编程范式的基础。不过在正式开讲之前,先问你个问题:什么是容器?你也许会说:容器,就是能够“容纳”“存放”元素的一些数据结构。这个回答非常正确,而且说到了“点”上。还记得计算机先驱的那句经典名言吗?“算法 + 数据结构 = 程序。”在 C++ 里,容器就是这个公式里面的“数据结构”。所以,下面就着重从数据结构的角度,来谈谈各种容器的区别、优缺点,还有如何选择最合适的容器。所谓的数据结构,就是数据在计算机里的存储和组织形式,比如堆、数组、链表、二叉树原创 2024-04-03 17:15:33 · 605 阅读 · 0 评论 -
11 | 一枝独秀的字符串:C++也能处理文本?
这是它的一个小缺点。原创 2024-04-03 17:15:07 · 986 阅读 · 0 评论 -
10 | lambda:函数式编程带来了什么?
在第 1 节课的时候,就说到过“函数式编程”,但只是简单提了提,没有展开讲。作为现代 C++ 里的五种基本编程范式之一,“函数式编程”的作用和地位正在不断上升,而且在其他语言里也非常流行,很有必要再深入研究一下。掌握了函数式编程,你就又多了一件“趁手的兵器”,可以更好地运用标准库里的容器和算法,写出更灵活、紧凑、优雅的代码。所以,今天就和你聊聊函数式编程,看看它给 C++ 带来了什么。说到“函数式编程”,那肯定就要先从函数(function)说起。C++ 里的函数概念来源于 C,是面向过程编程范式的基本部件原创 2024-04-03 17:04:18 · 931 阅读 · 0 评论 -
09 | exception:怎样才能用好异常?
上节课,建议尽量不用裸指针、new 和 delete,因为它们很危险,容易导致严重错误。这就引出了一个问题,如何正确且优雅地处理运行时的错误。实际上,想要达成这个目标,还真不是件简单的事情。程序在运行的时候不可能“一帆风顺”,总会遇到这样那样的内外部故障,而我们写程序的人就要尽量考虑周全,准备各种“预案”,让程序即使遇到问题也能够妥善处理,保证“健壮性”。C++ 处理错误的标准方案是“异常”(exception)。原创 2024-04-03 15:54:39 · 634 阅读 · 0 评论 -
08 | smart_ptr:智能指针到底“智能”在哪里?
所谓的“智能指针”,当然是相对于“不智能指针”,也就是“裸指针”而言的。所以,我们就先来看看裸指针,它有时候也被称为原始指针,或者直接简称为指针。指针是源自 C 语言的概念,本质上是一个内存地址索引,代表了一小片内存区域(也可能会很大),能够直接读写内存。因为它完全映射了计算机硬件,所以操作效率高,是 C/C++ 高效的根源。当然,这也是引起无数麻烦的根源。访问无效数据、指针越界,或者内存分配后没有及时释放,就会导致运行错误、内存泄漏、资源丢失等一系列严重的问题。原创 2024-04-03 14:31:30 · 620 阅读 · 0 评论 -
07 | const/volatile/mutable:常量/变量究竟是怎么回事?
上节讲了自动类型推导,提到 auto 推导出的类型可以附加 const、volatile 修饰(通常合称为“cv 修饰符”)。别看就这么两个关键字,里面的“门道”其实挺多的,用好了可以让你的代码更安全、运行得更快。今天我就来说说它们俩,以及比较少见的另一个关键字 mutable。先来看 const 吧,你一定对它很熟悉了。正如它的字面含义,表示“常量”。最简单的用法就是,定义程序用到的数字、字符串常量,代替宏定义。但如果我们从 C++ 程序的生命周期角度来看的话,就会发现,它和宏定义还是有本质区别的:原创 2024-04-03 11:59:16 · 895 阅读 · 0 评论 -
06 | auto/decltype:为什么要有自动类型推导?
我们从宏观的层面上重新认识了 C++,从今天开始,我们将进入一个新的“语言特性”单元,“下沉”到微观的层面去观察 C++,一起去见一些老朋友、新面孔,比如 const、exception、lambda。这次要说的,就是 C++11 里引入的一个很重要的语言特性:自动类型推导。原创 2024-04-03 11:38:36 · 719 阅读 · 0 评论 -
05 | 面向对象编程:怎样才能写出一个“好”的类?
如果按照前几节课的惯例,今天应该是讲运行阶段的。但是,运行阶段跟前面的编码、预处理和编译阶段不同,它是动态的、实时的,内外部环境非常复杂,CPU、内存、磁盘、信号、网络套接字……各种资源交织在一起,可谓千变万化(正如在第 1 节课里所说,每一个阶段的差异都非常大)。解决这个阶段面临的问题已经不是编程技术了,更多的是要依靠各种调试、分析、日志工具,比如 GDB、Valgrind、Systemtap 等。原创 2024-04-03 09:46:26 · 619 阅读 · 0 评论 -
04 | 编译阶段能做什么:属性和静态断言
前面讲了 C++ 程序生命周期里的“编码阶段”和“预处理阶段”,它们的工作主要还是“文本编辑”,生成的是而“编译阶段”就不一样了,它的目标是今天,就带你来看看在这个阶段能做些什么事情。原创 2024-04-02 22:33:30 · 575 阅读 · 0 评论 -
03 | 预处理阶段能做什么:宏定义和条件编译
接下来要说的是预处理编程里最重要、最核心的指令“#define”,它用来定义一个源码级别的“文本替换”,也就是我们常说的“宏定义”。“#define”可谓“无所不能”,在预处理阶段可以无视 C++ 语法限制,替换任何文字,定义常量 / 变量,实现函数功能,为类型起别名(typedef),减少重复代码……不过,也正是因为它太灵活,如果过于随意地去使用宏来写程序,就有可能把正常的 C++ 代码搞得“千疮百孔”,替换来替换去,都不知道真正有效的代码是什么样子了。所以,原创 2024-04-02 17:28:27 · 613 阅读 · 0 评论 -
02 | 编码阶段能做什么:秀出好的code style
上节介绍了 C++ 程序的生命周期和编程范式,今天就接着展开来讲,看看在编码阶段我们能做哪些事情。所以,我们在编码阶段的首要目标,不是实现功能,而是要写出清晰易读的代码,也就是要有好的 code style。怎么样才能写出 human readable 的好代码呢?这就需要有一些明确的、经过实践验证的规则来指导,只要自觉遵守、合理运用这些规则,想把代码写“烂”都很难。在此,强烈推荐一份非常棒的,它来自 OpenResty 的作者章亦春,代码风格参照的是顶级开源产品 Nginx,内容非常详细完善。原创 2024-04-02 16:38:11 · 605 阅读 · 0 评论 -
01 | 重新认识C++:生命周期和编程范式
今天是专栏的第一节正式课。我想,既然你选择了这个专栏,你就应该已经对 C++ 有所了解了,而且有过一些开发经验,甚至还掌握了一两种其他的语言。苏轼有诗云:“不识庐山真面目,只缘身在此山中。”学习 C++ 很容易被纷繁复杂的语法细节所吸引、迷惑,所以,我决定从“”和“”这两个不太常见的角度来“剖析”一下 C++,站在一个更高的层次上审视这门“历久弥新”的编程语言,帮你认清楚 C++ 最本质的东西。原创 2024-04-02 15:18:41 · 929 阅读 · 0 评论 -
课前准备 | 搭建实验环境
在开始正式的学习之前,我们需要先做一点准备工作——在自己的电脑上搭建出课程使用的实验环境。会给你推荐具体的操作系统、编译器,带你一步步搭建环境,还会给你分享,之后课程里的所有代码,你都可以在这里找到。原创 2024-04-02 14:19:04 · 682 阅读 · 0 评论 -
开篇词 | 把C++从“神坛”上拉下来,这次咱这么学
模块,我会结合 C++ 讲讲设计模式,并给出一个完整可用的 C++ 服务端程序例子(这里会与《 HTTP 协议》有个小小的联动)。这样“理论结合实际”,把前面的所有知识点都串联起来,让你看看在项目中 C++ 是具体怎么思考、设计、落地的。你实际动手研究一下代码,再试着改改,就能够把 C++ 的这些特性融会贯通了。除此之外,还特别设计了一个“原创 2024-04-02 11:41:54 · 613 阅读 · 0 评论