I、基础
C++基础部分:变量和基本类型,字符串、向量和数组,表达式,语句,函数,类
II、标准库
一、IO库
1.IO类:iostream、fstream、sstream三种头文件定义的IO类及其之间关系,IO对象无拷贝或赋值,流的条件状态(strm及其它相关、查询流状态iostate与failbit等、管理流状态clear等),管理输出缓冲(刷新输出缓冲、unitbuf操纵符、关联输入输出流tie);
2.文件输入输出fstream:fstream继承自iostream,但有其特殊函数,文件流对象(fstream传给iostream&形参、成员函数open和close、自动构造和析构),文件模式(in、out、app);
3.string流:和fstream一样,stringstream也继承iostream类,但也有其特殊操作,使用istringstream将读取的单行内容保存,使用ostringstream暂存输出内容(如需要逐个操作但一起输出时)。
二、顺序容器
容器是一些特定类型对象的集合。
1.顺序容器概述:(vector、deque、list等顺序容器的头尾增删/非顺序访问特点),(根据头尾增删和中间插入操作的频繁性)选择顺序容器;
2.容器库概览:容器可以保存的类型限制,容器操作,迭代器、迭代器范围(左闭合区间),容器类型成员(与元素类型、元素引用别名),begin和end成员,容器的定义和初始化,容器通过拷贝初始化(容器类型和元素类型都需要一样,通过参数初始化时可以不同),列表初始化和容器构造函数,标准库array初始化,容器的(拷贝)赋值和swap、assign,容器大小操作,容器之间的关系运算(逐个比较到第一个不同元素);
3.顺序容器操作:push_back()和push_front()操作、insert(insert返回值)、emplace,访问容器元素(front、back,解引用迭代器,访问成员函数返回引用类型,下标操作和安全随机访问at),删除元素(pop_front、erase和clear),特殊的forward_list操作,改变容器大小resize,容器操作可能使迭代器失效;
4.vector对象如何增长:vector内存分配策略,管理容器容量的成员函数(capacity、reserve);
5.额外的string操作:构造string类的其他方法,substr方法,改变string的其他方法(assign、inserte、append和replace),改变string的多种重载函数,string搜索操作(find、rfind函数、npos),compare函数,数值转换(to_string、stod);
6.容器适配器:(适配器是一种机制,能让接收的类型行为像另外一种类型一样)适配器定义(直接定义和规定基于的容器类型来定义),栈适配器及其操作(stack),队列适配器及其操作(queue、priority_queue)。
容器标准接口,容器动态内存管理,针对容器的标准库算法,容器的操作及可能会让迭代器失效。
三、泛型算法
泛型算法(generic algorithm):是指对于一些元素类型和标准库类型(以及数组)是通用的算法。
1.概述:(algorithm和numeric头文件)算法操作的是迭代器确定的范围,算法工作方式(只运行于迭代器之上);
2.初识泛型算法:只读算法(find、count、accumulate、equal),写容器元素的算法(fill、fill_n,注意算法不检查写操作),back_inserter,拷贝算法(copy),replace,重排算法(sort、unique);
3.定制操作:向算法传递函数(谓词predicate、字典序stable_sort),lambda表达式(定义、调用、捕获列表、),find_if调用lambda表达式,for_each,lambda捕获和返回(值捕获和引用捕获,隐式捕获、mutable实现的可变lambda、指定lambda返回类型),参数绑定(标准库bind函数、占位符空间placeholders名字、结合ref函数绑定引用参数);
4.再探迭代器:插入迭代器(back_inserter、front_inserter、inserter),iostream迭代器(istream_iterater、ostream_iterater、懒惰求值),反向迭代器(rbegin、rend、base);
5.泛型算法结构:5类迭代器(输入、输出、前向、双向、随机访问)及每一类可用的算法,算法形参模式(接收迭代器的数目和要求),算法命名规范(e.g. find和find_if);
6.特定容器算法:splice等。
四、关联容器
map和set相关类型。
1.使用关联容器:map容器基础,set容器基础;
2.关联容器概述:关联容器定义与初始化,multiset、multimap与set、map的区别,关键字类型的要求(关键字类型的严格弱序要求,定义关键字类型的比较函数),pair类型相关操作;
3.关联容器操作:关联容器成员类型别名,关联容器迭代器(first类型是const的、遍历、算法),添加元素(insert、向map添加、向multiset添加)及其返回类型,删除元素(erase)及其返回类型,map的下标操作( map[key]或map.at(key) )及其返回类型,访问元素(find、count、lower_bound和upper_bound、equal_range),单词转换程序;
4.无序容器:使用无序容器(unordered),管理桶相应操作,无序容器对关键字类型的要求(已有的hash模板适用范围)。
五、动态内存
1.动态内存与智能指针:new与delete,shared_ptr类及相关操作,make_shared函数,shared_ptr的拷贝和赋值,shared_ptr自动销毁所管理的对象以及释放内存,使用了动态生存期的资源的类(为什么使用动态内存),strBlob类;直接管理内存,使用new动态分配和初始化对象,动态分配的const对象,内存耗尽,释放动态内存,指针值和delete,动态对象生存期,delete之后重置指针值,delete提供有限保护;shared_ptr和new结合使用(注意初始化时只能用直接初始化的方式),不要混合使用普通指针和智能指针,不要用get为另一智能指针初始化或赋值,其它shared_ptr操作;智能指针和异常,智能指针和哑类,使用自己的释放操作;unique_ptr,传递unique_ptr参数和返回unique_ptr,向unique_ptr传递删除器;weak_ptr,检查指针类,指针操作;
2.动态数组:new和数组,分配数组的返回值,初始化动态分配内存的数组,动态分配一个空数组合法,释放动态数组,智能指针和动态数组(unique_ptr);allocator类,allocator分配未构造的内存,拷贝和填充未初始化内存的算法;
3.使用标准库的文本查询程序:文本查询程序设计,文本查询程序类的定义。
III、类设计工具
六、拷贝控制
1.拷贝、赋值与销毁:拷贝构造函数,合成拷贝构造函数,拷贝初始化,参数和返回值(参数必须是引用类型),拷贝初始化的限制(不能用explicit的构造函数拷贝一个实参),编译器可以绕过拷贝构造函数;拷贝复制运算符,重载赋值运算符,合成拷贝赋值运算符;析构函数,构造函数作用,合成析构函数;三/五法则,需要析构则需要拷贝/赋值,需要拷贝则也需要赋值;使用=default;阻止拷贝,定义删除的函数(=delete),析构函数不能是删除的成员,合成的拷贝控制成员可能是删除的,private拷贝控制;
2.拷贝控制和资源管理:行为像值的类,类值拷贝赋值运算符(自赋值情况);定义行为像指针的类,引用计数,类指针的拷贝成员“篡改”引用计数;
3.交换操作:swap函数,swap与std::swap,在赋值运算符中使用swap;
4.拷贝控制实例:(电子邮件)Message类,save和remove成员,Message类的拷贝控制成员,Message的析构函数,Message的拷贝赋值运算符,Message的swap函数;
5.动态内存管理类:StrVec类设计,使用construct,alloc_n_copy成员,…;
6.对象移动:右值引用,左值持久、右值短暂,标准库move函数及其特性;移动构造函数和移动赋值运算符,移动操作、标准库容器和异常,移动赋值运算符,移动源对象必须可析构,合成移动操作,移动右值、拷贝左值,右值拷贝在没有移动时发生,拷贝并交换赋值运算符和移动操作,Message类的移动操作,移动迭代器;右值引用和成员函数,成员函数的左值引用和右值引用版本(一般用const区分),右值和左值引用成员函数(使用引用限定符限定向左值/右值赋值),重载和引用函数(所有都加引用限定符或都不加)。
七、重载运算与类型转换
1.基本概念:重载基本规则,直接调用一个重载的运算符函数,某些运算符不应该被重载(重载后求值顺序不会被保留),重载后运算符应该与内置含义类似,赋值和复合赋值运算符,选择重载后成为成员或非成员;
2.输入和输出运算符:重载输出运算符<<,输出运算符尽量减少格式化操作,输入输出运算符必须是非成员函数;重载输入运算符>>,Scales_data重载>>实例,输入时的错误,标示错误;
3.算术和关系运算符:相等运算符,关系运算符;
4.赋值运算符:赋值运算符重载,复合赋值运算符;
5.下标运算符:下标运算符重载;
6.递增和递减运算符:定义前置递增/递减运算符,区分前置后后置运算符,显式地调用后置运算符;
7.成员访问运算符:解引用运算符和箭头运算符的重载,箭头运算符返回值的限定;
8.函数调用运算符:重载函数调用运算符()与函数对象,含有状态的函数对象类,lambda是函数对象,表示lambda及相应捕获行为的类;标准库定义的函数对象,在算法中使用标准库函数对象,可调用对象与function,不同类型可能具有相同的调用形式,标准库function类型(一个可调用对象的模板定义),重载的函数与function;
9.重载、类型转换与运算符:类型转换运算符,定义含有类型转换运算符的类,类型转换运算符可能产生意外结果,显式的类型转换运算符,转换为bool;避免有二义性的类型转换,实参匹配和相同的类型转换,二义性与转换目标为内置类型的多重类型转换,重载函数与转换构造函数,重载函数与用户定义的类型转换;函数匹配与重载运算符。
八、面向对象程序设计
1.OOP概述:继承,动态绑定(运行时绑定);
2.定义基类和派生类:定义基类,成员函数与继承,访问控制和继承;定义派生类,派生类中的虚函数(virtual关键字和override关键字),派生类对象和派生类向基类的类型转换(基类的指针或引用绑定到派生类对象的基类部分上),派生类构造函数,派生类使用基类成员,继承与静态成员,派生类的声明,被用作基类的类,防止继承的发生(final);类型转换(基类与派生类之间)与继承,静态类型与动态类型,不存在由基类向派生类的隐式类型转换,在对象之间不存在类型转换;
3.虚函数:对虚函数的调用可能在运行时才被解析(动态绑定只有通过指针或引用调用虚函数时才会发生),派生类中的虚函数,final和override说明符,虚函数与默认实参,回避虚函数的机制;
4.抽象基类:纯虚函数(=0标示),含有纯虚函数的类是抽象基类,派生类构造函数只初始化它的基类;
5.访问控制与继承:受保护的成员(受保护的成员只能通过派生类对象来访问,不能通过基类对象),公有、私有和受保护继承,派生类向基类转换的可访问性,友元与继承(友元不能继承),改变个别成员的可访问性(using语句),默认的继承保护级别;
6.继承中的类作用域:在编译时进行名字查找,名字冲突与继承(内层将隐藏外层,即派生类将隐藏基类),通过作用域运算符使用隐藏成员,名字查找总是先于类型检查,虚函数与作用域,通过基类调用隐藏的虚函数,覆盖重载的函数(using函数简化);
7.构造函数与拷贝控制:虚析构函数,虚析构函数阻止合成移动操作;合成拷贝控制和继承,构造函数与析构函数的继承,派生类中删除的拷贝控制与基类关系,移动操作与继承;派生类的拷贝控制成员,定义派生类的拷贝或移动构造函数,派生类赋值运算符,派生类析构函数,在构造函数和析构函数中调用虚函数;继承的构造函数(用using声明),继承的构造函数的特点;
8.容器与继承:在容器中放置(智能)指针而非对象,Basket类实例,basket成员,隐藏指针,模拟虚拷贝;
9.文本查询程序再探:面对对象的解决方案,抽象基类,将层次关系隐藏于接口类中,理解类的工作原理;query_base类和query类,query类(接口类),query的输出运算符;派生类,…。
九、模板与泛型设计
1.定义模板:函数模板,实例化函数模板,模板类型参数,非类型模板参数,inline和constexpr的模板参数,编写类型无关的代码,模板编译,模板编译错误大部分在实例化期间报告;类模板,定义类模板,实例化类模板,在模板作用域中引用模板类型,类模板的成员函数,check和元素访问成员,Blob构造函数,类模板成员函数的实例化,在类代码内简化模板类名的使用,在类模板外使用类模板名,类模板和友元,一对一友好关系,通用和特定的模板友好关系,令模板自己的类型参数成为友元,模板类型别名,类模板的static成员;模板参数,模板参数与作用域,模板声明,使用类的类型成员(typename来区分作用域运算符后的类型名),默认模板实参,模板默认实参与类模板;成员模板,普通(非模板)类的成员模板,类模板的成员模板,实例化与成员模板;控制实例化,extern声明,实例化定义会实例化所有成员;效率与灵活性,在运行时绑定删除器,在编译时绑定删除器;
2.模板实参推断:类型转换与模板类型参数,使用相同模板参数类型的函数形参,正常类型转换应用于普通函数实参;函数模板显式实参,指定显式模板实参,正常类型转换应用于显式指定的实参;尾置返回类型与类型转换,进行类型转换的标准库模板类;函数指针与实参推断;模板实参推断与引用,从左值引用函数参数推断类型,从右值引用函数参数推断类型,引用折叠和右值引用参数,编写接收右值引用参数的模板函数;理解std::move,从一个左值static_cast到右值引用;转发,定义能保持类型信息的函数参数,在调用中使用std::forward保持类型信息;
3.重载与模板:编写重载模板,多个可行模板,非模板和模板重载,重载模板和类型转换,缺少声明可能导致程序异常;
4.可变参数模板:sizeof运算符,编写可变参数函数模板,包扩展,理解包扩展,转发参数包;
5.模板特例化:定义函数模板特例化,函数重载与模板特例化,类模板特例化,类模板部分特例化,特例化成员而不是类。
IV、高级主题
十、标准库特殊设施
1.tuple类型:定义和初始化tuple类型,访问tuple成员(get、tuple_size、tuple_element),关系和相等运算符;使用tuple返回多个值,返回tuple的函数,使用函数返回的tuple;
2.bitset类型:定义和初始化bitset类,用unsigned值初始化bitset,用string初始化bitset;bitset操作,提取bitset值,bitset的IO运算符,使用bitset;
3.正则表达式:使用正则表达式库,指定regex对象的选项,指定或使用正则表达式时的错误,正则表达式类和输入类型序列;匹配与Regex迭代器类型,使用sregex_iterator,使用匹配数据;使用子表达式,子表达式用于数据验证,使用子匹配操作;使用regex_replace,只替换输入序列的一部分,用来控制匹配和格式的标志,使用格式标志;
4.随机数:随机数引擎和分布,分布类型和引擎,比较随机数引擎和rand函数,引擎生成一个数值序列,设置随机数发生器种子;其他随机数分布,生成随机实数,使用分布的默认结果类型,生成非均匀分布的随机数,bernoulli_distribution类;
5.IO库再探:操纵符改变格式状态,布尔值格式,整型值进制,输出中指出进制,浮点数格式,指定打印精度,指定浮点数计数法,打印小数点,输出补白,控制输入格式;未格式化的输入输出操作,单字节操作,将字符放回输入流,从输入操作返回的int值,多字节操作,确定读入了多少个字符;流随机访问,seek和tell函数,只有一个标记,重定位标记,访问标记,读写同一文件。
十一、大型程序的工具
1.异常处理:抛出异常(throw),栈展开,栈展开过程中对象自动销毁,析构函数和异常,异常对象,捕获异常(catch),查找匹配的处理代码,重新抛出,捕获所有异常的处理代码;函数try语句块与构造函数;noexcept异常说明,违反异常说明,异常说明的实参,noexcept运算符,异常说明与指针、虚函数和拷贝控制;异常类层次;
2.命名空间:命名空间定义,每个命名空间是一个作用域,命名空间可以不连续,定义命名空间成员,模板特例化,全局命名空间,嵌套命名空间,内联命名空间,未命名的命名空间;使用命名空间成员,命名空间别名,using声明,using指示,using指示与作用域,using指示实例,头文件与using声明或指示;类、命名空间与作用域,实参相关的查找与类类型形参,查找与std::move和std::forward,友元声明与实参相关的查找;重载与命名空间,重载与using声明,重载与using指示,跨越多个using指示的重载;
3.多重继承与虚继承:多重继承,多重继承的派生类从每个基类中继承状态,派生类构造函数初始化所有基类,继承的构造函数与多重继承,析构函数与多重继承,多重继承的派生类的拷贝与移动操作;类型转换与多个基类,基于指针类型和引用类型的查找;多重继承下的类作用域;虚继承,使用虚基类,支持向基类的常规类型转换,虚基类成员的可见性;构造函数与虚继承,虚继承的对象构造方式,构造函数与析构函数的次序。
十二、特殊工具与技术
1.控制内存分配:重载new和delete,operator new接口和operator delete接口, malloc与free函数;定位new表达式,显式析构函数调用;
2.运行时类型识别RTTI:typeid运算符、dynamic_cast运算符,指针类型的dynamic_cast,引用类型的dynamic_cast;使用typeid运算符;使用RTTI,类的层次关系,类型敏感的相等运算符,虚equal函数,基类equal函数;type_info类;
3.枚举类型:枚举成员,枚举(同类一样)定义新的类型,指定enum大小,枚举类型的前置声明,形参匹配与枚举类型;
4.类指针成员:数据成员指针,使用数据成员指针,返回数据成员指针的函数;成员函数指针,使用成员函数指针,使用成员指针的类型别名,成员指针函数表;将成员函数用作可调用对象,使用function生成一个可调用对象,使用mem_fn生成一个可调用对象,使用bind生成一个可调用对象;
5.嵌套类:声明一个嵌套类,在外层类之外定义一个嵌套类,定义嵌套类的成员,嵌套类静态成员定义,嵌套类作用域中名字查找,嵌套类和外层类相互独立;
6.union:节省空间的类:定义union,使用union类型,匿名union,含有类类型成员的union,使用类管理union成员,管理判别式并销毁string,管理需要拷贝控制的联合成员;
7.局部类:局部类不能使用函数作用域中的变量,常规的访问保护规则对局部类同样适用,局部类名字查找,嵌套局部类;
8.固有的不可移植特性:位域,使用位域;volatile限定符,合成的拷贝对volatile对象无效;链接指示extern"C",声明一个非C++函数,链接指示与头文件,指向extern"C"函数的指针,链接指示对整个声明都有效,导出C++函数到其它语言,重载函数与链接指示。