- cpplab是一个教程,试图基于实验的方式来理清C++的各种知识点。
- 本仓库所有代码都在wandabox.org上验证过,也建议使用wandbox.org来运行代码,能够支持多文件编译,并且也比较稳定。
- 有一些实验代码来自
cppreference.com
,已经足够优秀,为了保证教程的完整性,本教程会将其代码拷贝下来,但是会注明出处。 changkun/modern-cpp-tutorial
是一本非常优秀的C++书籍,但是本教程会更加着重讲述特性的使用场景,让读者明白特性设计动机,并更积极地去使用。BartVandewoestyne/Cpp
是一个优秀的教程,也是以实验为基本单元,但是缺少文档讲解,更缺少像书本一样的目录结构,想要抱着问题找答案,比较困难。Kobzol/hardware-effects
是一个优秀的教程,讲述关于CPU编程中的硬件利用效率,但本教程会试图涵盖更多的话题,例如语法、STL、设计模式等。
在这里,我们把所有的话题分为3个级别:特性、规则、语法糖。
- [特 性]:对开发效率或者执行效率有提升,我们应该使用。
- [规 则]:其他特性的附加内容,对开发效率和执行效率没有明显提升,但是如果不知道,可能会踩到坑,例如编译失败或者程序结果不符合预期。
- [语法糖]:对开发效率有提升,用了可以让代码更简洁,但不用也没有关系。
每个话题的标题会标记相应的级别。
- [语言]
- [特 性] 实验0:如何让一个接口既能接受左值,也能接受右值作为参数?
- [特 性] 实验1:如何优雅地拷贝基类指针指向的派生类对象?
- [特 性] 实验2:const关键字有什么作用?
- [特 性] 实验3:如何定义类成员引用?
- [特 性] 实验4:override关键字有什么作用?
- [特 性] 实验5:基于引用来调用虚函数
- [特 性] 实验6:为什么需要右值引用?
- [特 性] 实验7:重写(override)操作一定要虚函数形参和返回值完全一样吗?
- [特 性] 实验8:模板参数包(template paramter pack,可变长模板参数)的使用场景是什么?
- [[规 则] 实验xx:典型卡死场景:除以0语句会导致程序卡住?可能是多线程在搞鬼。
- [规 则] 实验9:构造与析构的执行顺序是什么?
- [规 则] 实验10:什么是名字隐藏(name hiding)?
- [规 则] 实验11:有了编译器返回值优化(RVO),为何还需要右值引用?
- [规 则] 实验12:指向内置类型的智能指针如何进行类型转换?
- [规 则] 实验13:指向类的智能指针如何进行类型转换?
- [规 则] 实验14:如何定义静态成员变量?
- [规 则] 实验15:模板类中的模板方法如何定义?
- [规 则] 实验16:如何访问模板基类成员?
- [规 则] 实验17:如何实现模板分离编译?
- [规 则] 实验18:为什么析构函数要声明为virtual?
- [规 则] 实验19:为什么不要在构造和析构函数中调用虚函数?
- [规 则] 实验20:模板函数能够声明为virtual吗?
- [语法糖] 实验21:为什么要定义匿名结构体?
- [TODO] [语法糖] 实验22:如何使
- [TODO] [语法糖] 实验23:字符串字面
- [标准库]
- [标准模板库STL]