本项目主要总结了 C++ 学习路线, 并且推荐学习参考代码、相关知识网址、博客。项目中代码有详细知识点注解,推荐大家把样例代码动手敲一遍,时间安排仅为建议时间、可根据自己进度自由调整~~
类(class):
-
构造/析构函数
掌握默认构造函数、构造函数重载、默认析构函数、析构函数重载、复制构造函数重载、赋值构造函数重载
-
运算符重载
掌握主要运算符+、-、*、/、前后置++、+= 等重载
-
new/delete 函数
学会 new/delete 函数重载,对比以下两种实现区别:当 new/delete被声明为私有函数时,类只能被实例化为栈对象,而不能实例化在堆内存。
https://github.com/gitgou/learnCPP_CN/blob/master/class/operator/stackStudent.cc
https://github.com/gitgou/learnCPP_CN/blob/master/class/operator/stackStudent.cc
类 (class):
-
继承
掌握私有、公有、保护继承的区别:
代码导航
掌握派生类向上转型,对比以下例子区别:
https://github.com/gitgou/learnCPP_CN/blob/master/class/inherit/DerivedCopy.cc
https://github.com/gitgou/learnCPP_CN/blob/master/class/inherit/DerivedCopy2.cc
了解 多重继承、 菱形继承的数据冗余和二义性问题及解决方法 -- 虚继承
-
函数重载: 如以上的构造函数重载,重载指允许在相同作用域中存在多个同名的函数,但要求参数列表不同
-
函数隐藏: 覆盖是存在类中,子类重写从基类继承过来的函数,函数名、返回值、参数列表都必须和基类相同。当子类的对象调用成员函数的时候,如果成员函数有被覆盖则调用子类中覆盖的版本,否则调用从基类继承过来的函数。
-
动态多态(发生在运行期):
-
函数覆盖 :虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写。最常见的用法就是声明基类的指针,利用该指针指向任意一个子类对象,调用相应的虚函数。重点掌握虚函数机制 -- 虚函数表、声明纯虚函数的抽象类、菱形继承。
-
STL 六大组件:容器(container)、算法(Algorithm)、迭代器(Iterator)、函数对象(Functional Object)、内存分配器(Allocator)、适配器(Adapter)
-
STL -- string library
掌握 string 常见的成员函数,并且动手实现 string类;掌握 string 写时复制技术(cow)
-
STL -- Input/Output library
-
STL组件 -- 容器:
序列容器: vector、list、deque等;
关联容器:map、unordered_map、multimap、set、unordered_set、multiset 等的使用及原理
小训练
-
RAII
RAII全称是“Resource Acquisition is Initialization”,即 “资源请求即初始化”, 为解决资源管理时异常安全性所使用的资源管理方法。
掌握 auto_ptr(C++17 已经被正式从C++标准里删除了)、unique_ptr、shared_ptr、weak_ptr 原理及用法; 样例代码中用法都有介绍。
重点掌握 unique_ptr 原理,shared_ptr 原理(引用计数管理方法),weak_ptr 与 shared_ptr的区别:weak_ptr是为了配合shared_ptr而引入的一种智能指针,它指向一个由shared_ptr管理的对象而不影响所指对象的生命周期,也就是将一个weak_ptr绑定到一个shared_ptr不会改变shared_ptr的引用计数。不论是否有weak_ptr指向,一旦最后一个指向对象的shared_ptr被销毁,对象就会被释放。从这个角度看,weak_ptr更像是shared_ptr的一个助手而不是智能指针。
-
数据结构
-
排序算法
实现以下排序算法,熟悉排序算法原理、平均(最坏)时间复杂度、稳定性等指标,熟悉各排序算法应用场景。
-
LeetCode 算法
https://github.com/gitgou/LeetCode
Tips: 后续会将 LeetCode 刷题记录整理出来。
-
STL string cow,写时复制(0 copy):
-
STL 函数对象:
重载函数调用操作符的类,其对象称为函数对象(function object)
-
设计模式:
这里只举例了三种设计模式:单例、观察者、PIMPL模式
总共有二十几种设计模式,重点掌握单例模式、观察者模式、工厂模式、代理模式、外观模式、适配器模式;推荐学习网站:设计模式 、 图解设计模式;后续再补充其它设计模式代码。
-
thread 多线程
熟悉 pthread库的使用,掌握互斥变量 pthread_mutex_t、条件变量 pthread_cond_t 、信号量semaphore(博客推荐)。
实现了两个版本的线程库供参考:thread
-
socket 网络编程
掌握 socket 编程相关接口的使用,熟悉同步/异步、阻塞/非阻塞(博客推荐);熟悉 select/poll/epoll 的优缺点;TCP 三次握手/四次挥手不同阶段状态。
未完待续...
因时间紧促,资料补充不够充分,后续会陆续补充;有误之处,还望多多指正,也欢迎一起参与项目建设,联系方式见 github 主页,感谢。