哪有适合初学者阅读的C++代码资源?

发布时间:
2023-08-15 23:34
阅读量:
15

一. uWebSocket 网络库

uWebSocket 是一款开源的 WebSocket 库,最新版使用了大量 C++17 的语法,代码量很少,既可以学习 Modern C++ 的一些用法,也可以学习网络框架编写和协议的设计。

下载地址:

github.com/uNetworking/


二、FlamingoIM

FlamingoIM 是一款轻量级开源即时通讯软件,其目前有服务器端、pc 端和安卓端,三端都是 native 应用,从通信协议到界面库都自主开发,不是使用第三的库包装而成。大家平常用微信和 QQ 比较多,所以学习起来,对即时通讯本身没有业务理解负担。

github.com/balloonwj/fl

目前已经实现了如下功能(这里只列举网络相关的功能,其他客户端已经实现的功能不统计在列):

  • 注册
  • 登录
  • 查找好友、查找群
  • 添加好友、添加群
  • 好友列表、群列表、最近会话
  • 单人聊天功能(包括发文字、表情、窗口抖动、离线文件)
  • 群组功能(包括发文字、表情)
  • 群发消息
  • 修改密码
  • 修改个人信息(自定义昵称、签名、个性头像等个人信息)
  • 自动升级功能
  • 断线重连
  • 客户端还有很多细节功能,比如头像有三种显示模式、好友上线动画、聊天记录、聊天自动回复功能等,有兴趣的同学可以自己探索尝试一下吧,这里就不截图了。

我为 Flamingo 专门录制了两部高清技术讲解视频以方便读者学习,视频中介绍了Flamingo的编译和部署方法、整体架构、各个模块的技术实现细节以及如何学习 Flamingo 的方法,视频教程下载链接:

链接:pan.baidu.com/s/1BetRcF 提取码:my1x

以下是部分截图:



三、TeamTalk

TeamTalk 简称 tt,是蘑菇街开源的一款即时通讯 IM,代码地址:

github.com/balloonwj/Te

我为 TeamTalk 写了一个源码解析的专题:

TeamTalk源码分析(一)-- TeamTalk介绍

TeamTalk源码分析(二) -- 服务器端的程序的编译与部署

TeamTalk源码分析(三) -- 服务器端的程序架构介绍

TeamTalk源码分析(四) -- 服务器端db_proxy_server源码分析

TeamTalk源码分析(五) -- 服务器端msg_server源码分析

TeamTalk源码分析(六) -- 服务器端login_server源码分析

TeamTalk源码分析(七) -- 服务器端msf源码分析

TeamTalk源码分析(八) -- 服务器端file_server源码分析

TeamTalk源码分析(九) -- 服务器端route_server源码分析

TeamTalk源码分析(十) -- 开放一个TeamTalk测试服务器地址和几个测试账号

TeamTalk源码分析(十一) —— pc客户端源码分析

TeamTalk 服务端网络拓扑图:

客户端运行截图:

四、Filezilla

Filezilla是一款高性能ftp/sftp文件工具,关于它的具体的介绍可参见其官网:filezilla.cn/。其原作者是Tim Kosse (tim.kosse@filezilla-project.org)。

大概 10 年前我从校园网 ftp 资源时无意中接触到这款软件的客户端之后,其强大的功能和流畅的性能让我一直使用至今。即使在今天,我的开发环境已经换成 Linux,我仍然使用它在 Windows 与linux服务器目录互传文件资源,另外像 qq 这些即时通讯软件不支持大于 4G 的文件传输,filezilla也能够支持的。

新版的 FileZilla 源码使用了 Modern C++ 重写,代码质量比较高,我已经为大家生成了 Visual Studio 解决方案文件,用 VS 打开可以一键编译到底并调试。

代码链接:

链接:pan.baidu.com/s/11qHeNN 提取码:z3hg

软件界面如下:

客户端:

服务器端包括,两个程序,一个是以windows服务形式运行的filezillaserver,另外一个是对服务器端连接的用户账号、共享目录等信息进行控制的filezillaserverinterface:

五、一些可能对你有用的资源

如果你平常用的 C++ 比较多,但是觉得 C++ 写的不地道,对于大型 C++ 项目不知道如何规划模块,不知道如何设计类关系,接口设计不优雅,推荐你阅读一下《大规模 C++ 程序设计》和 《C++ API 设计》这两本书:

《大规模 C++ 程序设计》
链接:pan.baidu.com/s/15hXUwv 提取码:cveg
《C++ API》设计
链接:pan.baidu.com/s/1CnCDUk 提取码:o5v4

六、 C++ 学习路线

我做 C++ 开发将近十年了,做过大大小小的 C++ 项目。这里给出一份 C++ 语言的学习路线。

如果想系统地学习 C++,C++98/03 中 C++ 语言的基本知识需要逐个掌握,包括但不局限于:

  • 指针和引用的概念
  • 指针与内存关系
  • 程序编译过程,静态链接库和动态链接库
  • static、const、#define的用法和区别
  • C和C++区别
  • 内存中的栈和堆分配
  • 面向对象理解
  • 访问限定符 public/protected/private
  • 构造函数/析构函数/拷贝构造
  • 多态
  • 虚函数与纯虚函数、虚函数实现机制、虚函数表
  • 继承原理、虚继承、菱形继承
  • new/delete和malloc/free
  • 重载、重写和覆盖
  • 类型转换方式
  • RAII 与 pimpl 惯用法
  • 内存溢出和内存泄漏
  • STL标准模板库
  • 迭代器、空间配置器理解
  • 常用容器特点、用法以及底层实现vector、list、deque、set、map、unorderedmap

内容有点多,只有理解了,才能记得住,关于 C++ 语言背后的实现原理可以看看侯捷老师翻译的《深度探索 C++ 对象模型》一书。

链接: pan.baidu.com/s/1eBBtBY 提取码: 959g

想掌握一些常用的 C++ 编码技巧,推荐阅读《提高C++性能的编程技术》,这本书很薄,但是内容都比较实用,看起来比较轻松。

链接: pan.baidu.com/s/1XCE9WV 提取码: 6bp9

可用于工程实践的 C++ 书(例如如何结合 C++ 语言特性设计出优雅而鲁棒的 C++ API、如何优雅地组织和管理一个大型 C++ 工程等)推荐《C++ API 设计》《大规模 C++ 程序设计》:

链接: pan.baidu.com/s/1hkleT0 提取码: q802 链接: pan.baidu.com/s/1P4iJ3H 提取码: m3fn

Modern C++中,C++11/14/17 新标准已经成为主流,这块也要熟悉,要熟悉新标准常用的语法与新功能,包括但不限于:

  • 左值/右值/std::move/std::forward
  • 统一的类成员初始化语法与 std::initializer_list
  • 注解标签(attributes)
  • final/override/=default/=delete 语法
  • auto 关键字
  • Range-based 循环语法
  • 结构化绑定
  • stl 容器新增的实用方法
  • std::thread
  • 线程局部存储 thread_local
  • 线程同步原语 std::mutex、std::condition_variable 等
  • 原子操作类
  • 智能指针类
  • std::bind/std::function

C++11/14 网上的资料已经很多了,C++17 的资料不多,重点掌握的还是 C++11 引入的各种实用特性,这就给读者推荐一些我读过的书:

  • 《深入理解 C++11:C++11 新特性解析与应用》
  • 《深入应用 C++11:代码优化与工程级应用》
  • 《C++17 完全指南》
  • 《Cpp 17 in Detail》
链接: pan.baidu.com/s/1K_Ous0 提取码: lsk8

另外,Effective C++ 系列的作者 Scott Meyers 又写了本介绍现代 C++ 各种技巧和避坑指南的书《Effective Modern C++》,这本书也不错,推荐一下:

链接: pan.baidu.com/s/1HA1INg 提取码: ghl9 链接: pan.baidu.com/s/14n2gYK 提取码: 7kjw

八、 学习 C++ 相关的开发工具链和调试技巧

如果你在 Linux 下作 C++ 开发,一定要学会用 GDB 调试。熟练掌握 gdb 调试等于拥有了学习优秀 C 和 C++ 开源项目源码的钥匙,只要可以利用 gdb 调试,再复杂的项目,在不断调试和分析过程中总会有搞明白的一天。所以,学习 C++ 最好的方法是多调试。

建议掌握:

  • 如何启动和结束调试
  • 如何添加/删除/启用/禁用断点(包括普通断点、条件断点和数据断点)
  • 如何查看当天断点下的调用对战
  • 如何查看程序运行过程中的线程信息(这块可以放到下文再学)
  • 如何查看某个变量的内存值

关于 gdb 调试 ,我推荐《gdb 高级调试实战教程》,电子书下载链接:

链接:pan.baidu.com/s/1b29dGW 提取码:puco

以下是《gdb 高级调试实战教程》目录:


我学习和使用 C/C++ 开发快 13 年了,目前在大厂做架构,学习 C/C++ 过程中踩了一个又一个坑,深知新手学习 C/C++ 的重要性和存在的困难,因此特地给 C/C++ 开发的同学精心准备了一份优质学习资料————CppGuide,内容从 C/C++ 语言、网络编程、操作系统原理到完整的项目源码分析,同时这份资料也包括 C/C++ 学习方法、推荐的阅读书籍、简历指导和求职技巧等。

CppGuide 学习资料

四、授人以鱼不如授人以渔

写在最后,学习 C/C++ 非一朝一夕之功,需要一点一点地学习,多积累,多实践,多从优秀代码中学习经验,假日时日,一定能达到不错的 C++ 水平。

如果觉得有帮助,记得给 @张小方 点个赞呗~

END