哪有适合初学者阅读的C++代码资源?
一. uWebSocket 网络库
uWebSocket 是一款开源的 WebSocket 库,最新版使用了大量 C++17 的语法,代码量很少,既可以学习 Modern C++ 的一些用法,也可以学习网络框架编写和协议的设计。
下载地址:
https://github.com/uNetworking/uWebSockets
二、FlamingoIM
FlamingoIM 是一款轻量级开源即时通讯软件,其目前有服务器端、pc 端和安卓端,三端都是 native 应用,从通信协议到界面库都自主开发,不是使用第三的库包装而成。大家平常用微信和 QQ 比较多,所以学习起来,对即时通讯本身没有业务理解负担。
https://github.com/balloonwj/flamingo
目前已经实现了如下功能(这里只列举网络相关的功能,其他客户端已经实现的功能不统计在列):
- 注册
- 登录
- 查找好友、查找群
- 添加好友、添加群
- 好友列表、群列表、最近会话
- 单人聊天功能(包括发文字、表情、窗口抖动、离线文件)
- 群组功能(包括发文字、表情)
- 群发消息
- 修改密码
- 修改个人信息(自定义昵称、签名、个性头像等个人信息)
- 自动升级功能
- 断线重连
- 客户端还有很多细节功能,比如头像有三种显示模式、好友上线动画、聊天记录、聊天自动回复功能等,有兴趣的同学可以自己探索尝试一下吧,这里就不截图了。
我为 Flamingo 专门录制了两部高清技术讲解视频以方便读者学习,视频中介绍了Flamingo的编译和部署方法、整体架构、各个模块的技术实现细节以及如何学习 Flamingo 的方法,视频教程下载链接:
链接:https://pan.baidu.com/s/1BetRcF5WXs7b3vIMe-Gl4w 提取码:my1x
以下是部分截图:
三、TeamTalk
TeamTalk 简称 tt,是蘑菇街开源的一款即时通讯 IM,代码地址:
https://github.com/balloonwj/TeamTalk
我为 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文件工具,关于它的具体的介绍可参见其官网:https://www.filezilla.cn/。其原作者是Tim Kosse (tim.kosse@filezilla-project.org)。
大概 10 年前我从校园网 ftp 资源时无意中接触到这款软件的客户端之后,其强大的功能和流畅的性能让我一直使用至今。即使在今天,我的开发环境已经换成 Linux,我仍然使用它在 Windows 与linux服务器目录互传文件资源,另外像 qq 这些即时通讯软件不支持大于 4G 的文件传输,filezilla也能够支持的。
新版的 FileZilla 源码使用了 Modern C++ 重写,代码质量比较高,我已经为大家生成了 Visual Studio 解决方案文件,用 VS 打开可以一键编译到底并调试。
代码链接:
链接:https://pan.baidu.com/s/11qHeNNCKFglRbi4jqi4-vw 提取码:z3hg
软件界面如下:
客户端:
服务器端包括,两个程序,一个是以windows服务形式运行的filezillaserver,另外一个是对服务器端连接的用户账号、共享目录等信息进行控制的filezillaserverinterface:
五、一些可能对你有用的资源
如果你平常用的 C++ 比较多,但是觉得 C++ 写的不地道,对于大型 C++ 项目不知道如何规划模块,不知道如何设计类关系,接口设计不优雅,推荐你阅读一下《大规模 C++ 程序设计》和 《C++ API 设计》这两本书:
《大规模 C++ 程序设计》
链接:https://pan.baidu.com/s/15hXUwvZ_kXXbYkYKPrjINA 提取码:cveg
《C++ API》设计
链接:https://pan.baidu.com/s/1CnCDUkX0W46IJz1YhWfI0Q 提取码: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++ 对象模型》一书。
链接: https://pan.baidu.com/s/1eBBtBYCA2asEJpLiUYQ9uQ 提取码: 959g
想掌握一些常用的 C++ 编码技巧,推荐阅读《提高C++性能的编程技术》,这本书很薄,但是内容都比较实用,看起来比较轻松。
链接: https://pan.baidu.com/s/1XCE9WV53GE8DPQXC2sF8ZQ 提取码: 6bp9
可用于工程实践的 C++ 书(例如如何结合 C++ 语言特性设计出优雅而鲁棒的 C++ API、如何优雅地组织和管理一个大型 C++ 工程等)推荐《C++ API 设计》《大规模 C++ 程序设计》:
链接: https://pan.baidu.com/s/1hkleT0kUgCCPyR9RVH4fMA 提取码: q802 链接: https://pan.baidu.com/s/1P4iJ3HfJi0EdHJLUPD9bKA 提取码: 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》
链接: https://pan.baidu.com/s/1K_Ous0sOWEN_7cVisGvBQA 提取码: lsk8
另外,Effective C++ 系列的作者 Scott Meyers 又写了本介绍现代 C++ 各种技巧和避坑指南的书《Effective Modern C++》,这本书也不错,推荐一下:
链接: https://pan.baidu.com/s/1HA1INg5cdHIZoQLUCgDHxQ 提取码: ghl9 链接: https://pan.baidu.com/s/14n2gYKKYCL-qrt2sCPI6tA 提取码: 7kjw
八、 学习 C++ 相关的开发工具链和调试技巧
如果你在 Linux 下作 C++ 开发,一定要学会用 GDB 调试。熟练掌握 gdb 调试等于拥有了学习优秀 C 和 C++ 开源项目源码的钥匙,只要可以利用 gdb 调试,再复杂的项目,在不断调试和分析过程中总会有搞明白的一天。所以,学习 C++ 最好的方法是多调试。
建议掌握:
- 如何启动和结束调试
- 如何添加/删除/启用/禁用断点(包括普通断点、条件断点和数据断点)
- 如何查看当天断点下的调用对战
- 如何查看程序运行过程中的线程信息(这块可以放到下文再学)
- 如何查看某个变量的内存值
关于 gdb 调试 ,我推荐《gdb 高级调试实战教程》,电子书下载链接:
链接:https://pan.baidu.com/s/1b29dGWOq5KPekiGPMQ4thA 提取码:puco
以下是《gdb 高级调试实战教程》目录:
我学习和使用 C/C++ 开发快 13 年了,目前在大厂做架构,学习 C/C++ 过程中踩了一个又一个坑,深知新手学习 C/C++ 的重要性和存在的困难,因此特地给 C/C++ 开发的同学精心准备了一份优质学习资料————CppGuide,内容从 C/C++ 语言、网络编程、操作系统原理到完整的项目源码分析,同时这份资料也包括 C/C++ 学习方法、推荐的阅读书籍、简历指导和求职技巧等。
CppGuide 学习资料四、授人以鱼不如授人以渔
写在最后,学习 C/C++ 非一朝一夕之功,需要一点一点地学习,多积累,多实践,多从优秀代码中学习经验,假日时日,一定能达到不错的 C++ 水平。
如果觉得有帮助,记得给 @张小方 点个赞呗~