第一篇、C++面向过程
一、变量与运算符
- 变量与基本数据类型(=赋值与()赋值)
- 常量
- 算术运算与算术表达式(,逗号表达式)
二、选择与循环
- 选择和if、switch(?:形式)
- 循环
三、数组与字符串
- 数组概念、一维数组、二维数组存储方式、定义与引用
- 指针与数组(数组名是常量指针)、数组指针与指针数组、动态分配二维数组5种方法
- 字符数组与字符串
四、指针与内存
&:取地址运算符;*:间接寻址/解引用运算符
- 指针、指针变量、数组与指针、引用与指针引用
- 函数与指针、函数指针(做函数参数与调用函数)与指针函数
- 动态分配内存(new、delete)
指针是一个存储地址的变量,指针使用一般包括创建和指向两部分,创建时要在*
号前声明该指针指向的数据类型,指向即把地址赋给指针变量名,要注意是否需要强制类型转换。
五、自定义数据类型
自定义数据类型一般都由[自定义类型关键字]+[自定义类型名]+[成员说明]构成,有时在前面加上typedef(同时在后面加上一个助记的类型别名)来简化创建相应类型的变量的过程。
- 结构体:结构体的声明、成员(域)、结构体定义三种形式、结构体作结构体成员、结构体成员整体和局部初始化;结构体的变量的引用规则、结构体变量地址;结构体数组及其定义(三种方式)、初始化;指向结构体变量的指针;结构体类型做函数参数(值传递、指针传递、引用传递)
- 共用体:共用体定义、共用体变量的引用
- 枚举:枚举定义、枚举元素默认值、关系运算、变量强制赋值(枚举类型创建变量、初始化,该变量为枚举类型,但值为整数)
- 链表:链表的结构,如何创建链表(头结点、下一结点分配内存与指向、尾结点),链表与数组区别(存储、动态、灵活与空间、增删),删除链表,在链表中增加(插入)结点。链表实际上就是一系列带指针指向的结构体,所以对链表操作一般包括[结构体定义+创建一个指向该结构体类型的指针+为指针分配空间malloc+将该结点通过指针指向与其它结点连接起来]。
六、函数
- 函数[函数名、参数、返回值、函数体]:无参函数,有参函数及参数格式,函数体与函数头,函数原型、函数声明;
- 函数参数:形参和实参(内存分配与释放、“值传递”),值传递(不改变实参),引用传递(改变实参),指针传递(改变实参),指针与引用区别、指针传递和引用传递区别与优缺点,指针引用传递,有缺省参数的函数,内联函数inline,函数指针作为参数传入另一函数;
- 函数嵌套调用:嵌套调用,递归调用;
- 函数重载:函数重载的含义,函数重载机制
- 函数变量:局部变量,全局变量(外部变量)与extern关键字,静态(存储区)局部变量,静态全局变量;(存储区域、作用域、生存周期)
七、面向过程其它
- const与static关键字:const修饰常量、修饰指针和指针指向的类型,const常引用、常成员函数、常对象;static静态变量与静态函数,类的静态成员(静态数据成员和静态成员函数)(类的静态变量初始化),静态全局变量与静态全局函数;
- 内存问题:(堆)内存泄漏以及内存泄漏的类型,野指针,试图修改常量,sizeof(给函数传数组时实际上传的是指针变量);
- 带参主函数:atoi
第二篇、C++面向对象
八、类和对象基础(数据成员)
- 面向对象相关概念:对象、通信、类与对象(类的实例化)、继承、封装、多态、动态绑定;特点:抽象、封装、继承、多态(静态多态与动态多态,强制多态、重载多态、类型参数化多态、包含多态);
- 类声明与定义:类的声明(public外部接口,protected保护成员,private私有成员),类和结构(体)对比;
- 类成员变量:public、protected、private关键字,类成员变量赋值(对公有非静态成员变量赋值、对静态成员变量赋值、对私有非静态成员变量赋值);
- 类的成员函数:成员函数原型与定义,带默认形参值的成员函数,内联成员函数(隐式声明和显式声明);
- const成员变量与成员函数:const成员变量(构造函数通过初始化列表对数据成员初始化),const成员函数(数据成员对于成员函数只是可读的,原型和定义后都加const,只能被常量对象调用);
- 静态成员变量与成员函数:静态数据成员与非静态数据成员,静态数据成员访问,静态数据成员定义与初始化,静态成员函数特性
九、类和对象(函数)
- 类的构造函数(Constructor):C++中关于构造函数的规定,无参构造函数,有参构造函数定义与调用,构造函数的重载,参数带有默认值的构造函数,使用参数初始化表对数据成员的初始化(无参构造函数与有参构造函数使用参数初始化列表对数据成员初始化);
- 类的析构函数(Destructor):析构函数概念,析构函数的作用,构造函数和对应析构函数的调用顺序;
- 复制构造函数:复制构造函数概念,复制构造函数的应用实例(对象以值传递方式传入函数体、从函数返回,一个对象通过另一对象初始化)、与赋值的不同,复制构造函数的定义,浅复制与深复制,复制构造函数的调用(显式调用与隐式调用对象作为函数的形参时隐式调用,对象作为函数返回值时隐式调用);
- 类作用域和对象生存期:类的作用域(类域),类域与文件域、函数域,类可被定义的3种作用域(全局作用域、嵌套类、局部类),类中成员具有类的作用域的情况,(域运算符);对象生存期(局部对象、静态对象、全局对象);
- 友元:友元函数(声明与定义、友元函数的一些规定),友元成员(友元成员的含义,友元成员声明与定义、友元成员使用注意),友元类(友元类的含义,友元类声明与使用方法、使用注意);
- 对象指针:指向对象的指针(指向数据成员的指针与指向成员函数的指针),this指针;
- 对象的动态建立与释放:对象的建立,对象的释放(小心野指针),malloc/free与new/delete区别(自动执行构造和析构函数)
十、运算符重载(operator)
- 运算符重载概要:运算符重载规则,运算符重载为类的成员函数/类的友元函数,运算符重载的注意;
- 运算符重载:单目运算符重载,双目运算符重载,其它运算符重载(如[]),运算符重载为友元函数
十一、类的继承
- 继承与派生的概念:单重继承与继承方式(public、protected、private),派生类的构成(从基类接收,调整从基类接收,派生类增加);
- 派生类的声明方式:多重继承,派生类声明方式,直接基类和间接基类、类族;
- 派生类成员的访问权限:公有继承(派生类对基类)访问权限,私有继承访问权限,保护继承访问权限;
- 派生类的构造函数和析构函数:派生类构造函数与基类构造函数的关系,派生类构造函数的定义格式[<子类名>::<子类构造函数名(int var1,int var2)>:<基类构造函数名(var1)>],派生类构造函数说明,派生类的析构函数;
- 虚基类:(继承时在基类前加virtual关键字)虚基类的概念和采用虚基类的原因,使用虚基类的注意,共同基类带来的二义性;
- 基类与派生类的相互转换:派生类对象给基类对象赋值(基类不能给派生类对象赋值),派生类对象地址赋给基类对象的指针,基类指针引用派生类对象
十二、多态与虚函数
- 多态与虚函数简介:多态含义,静态联编(static binding)、静态束定,动态联编(在虚函数下实现),静态联编与动态联编区分,联编本质,动态联编条件,虚函数(含义、动态联编时只能通过指针或引用标识对象操作),虚函数的声明与定义,关于虚函数的几点说明(可定义为虚函数的几类函数,只在声明时加virtual关键字,不能出现同名非虚函数),虚函数的原理(虚函数表,通过获得虚函数表中每一个虚函数的指针来调用相应的虚函数);
- 虚函数的访问:多态类,对象名虚函数访问方法(静态联编方式实现多态),基指针虚函数访问方法(动态联编方式,定义基类指针,指向派生类),引用虚函数访问方法(分别创建指向基类和派生类的引用),类内访问方式(this指针,在一虚函数内调用另一虚函数),在构造函数或析构函数内访问(静态聚束,在构造函数内调用虚函数时需要指定类名);
- 纯虚函数与抽象类:纯虚函数的含义(基类中无定义,派生类中重写),纯虚函数的声明和定义,纯虚函数使用说明,抽象类含义,抽象类使用规定,另一种抽象类(类中只定义了protected型的构造函数,不能声明该类的对象,只能定义其类的指针)及其好处,虚析构函数(解决delete动态对象时只执行基类析构函数的问题);
- 虚函数引入的二义性:多基(类)派生的二义性(同名成员的二义性,用域分辨符:解决;继承链的二义性问题,使用作用域分辨符唯一标识),虚继承(与虚基类相关,继承时在基类继承方式前加virtual关键字);
- 重载(overloaded)、覆盖(override)与隐藏(hide):成员函数的重载(相同范围、函数名相同、参数不同、virtual关键字可有可无),成员函数的覆盖(不同范围、函数名相同、参数相同、基类必须有virtual关键字),成员函数的隐藏(不同范围、函数名相同、参数不同、virtual关键字可有可无;不同范围、函数名和参数都相同、基类无virtual关键字),重载(overloaded)、覆盖(override)与隐藏(hide)不同之处的理解,(重载时在一个类中调用,覆盖是通过关键字virtual实现了多态,隐藏则是完全把基类函数重写)
第三篇、C++泛型编程
十三、模板
- 模板的概念:模板的应用原因;
- 函数模板:函数模板的一般定义(template + < typename/class A> + 函数定义),显式具体化(利用显式具体化模板函数增加一个专门针对特定类型的实现方式不同的具体化函数),优先级与执行顺序(在参数都匹配的情况下,普通非模板函数优先于函数模板);
- 类模板:类模板的一般定义,模板类声明格式,类模板成员函数体写法的一般形式,类模板对象的创建方式(例:类名+<long,double>+对象名),模板类的继承(模板类继承特点,模板类实现多态),模板类的静态数据成员(模板类的静态数据成员不共用)
十四、标准模板库(STL)
- STL概述:算法(algorithm)简介(包括头文件[algorithm]、[numeric]和[functional]),容器简介(包括头文件[vector]连续存储的元素、[list]结点组成的双向链表、[deque]连续存储的指向不同元素的指针所组成的数组、[set]由结点组成的红黑树、[map]键值对、[multiset]允许存在两个次序相等的元素的集合、[stack]后进先出/栈、[queue]先进先出/队列、[priority_queue]优先队列、[multimap]多重映射),迭代器简介(由头文件[utility]、[iterator]和[memory]组成),适配器(adaptor)简介(容器适配器、迭代器适配器和函数适配器),函数对象(function object),空间/内存分配器(allocator);
- 容器(container):向量容器(提供动态数组的功能,向量构造函数、得到向量内数据数量信息、加入/删除元素、首尾指针、索引),列表容器(提供对(双向)链表的数据存储和操作,列表构造函数、得到列表容器内数据数量信息、增加/删除元素、访问向量容器数据成员);
- 迭代器(iterators):输入和输出迭代器(istream_iterator和ostream_iterator,在程序中定义输入、输出迭代器,可用泛型算法从流对象中读取数据/将数据写到流对象中),前向迭代器、双向迭代器和随机访问迭代器(迭代器数据读写,前向只支持单向、双向可以前后两个方向遍历,随机可以访问任意位置),插入迭代器(将值插入到容器中,也叫适配器,有前插入迭代器、后插入迭代器和普通插入迭代器),混合迭代器函数(advance()按指定数目增减,distance()返回到达一个迭代器所需(递增)操作的数目),迭代器适配器(适配器是用来修改其他组件接口的STL组件,迭代器适配器,包括逆向迭代器、插入型迭代器);
- 算法和函数对象:(包括非可变序列算法、可变序列算法、排序相关算法和通用数值算法)STL通用算法的调用形式,不可变序列算法(不直接修改所操作的容器内容的算法,包括查找、相等检查),可变序列算法[复制(copy)、生成(generate)、删除(remove)、替换(replace)、倒序(reverse)、旋转(rotate)、交换(swap)、变换(transform)、分割(partition)、剔除(unique)、(fill)、洗牌(shuffle)],函数对象(普通函数定义函数对象,类作函数对象且在定义中重载函数调用运算符)
第四篇、输入/输出处理和编程规范
十五、输入/输出
- 输入/输出概述:(C++ iostream流库与C标准输入输出库),流(流类、流对象),(输入/输出)缓冲区,3种输入/输出流(标准I/O、文件I/O、串I/O,每一种包含输入、输出、既输入又输出),重定向;
- C语言I/O库函数:标准输出printf,标准输入(scanf),sprintf与sscanf,C语言的文件访问机制(fopen、fread、fwrite和flose,FILE型文件结构);
- 流类库:C标准输入输出库的问题(无类型适配、sscanf易丢&,无法输入输出自定义类型数据),流类库层次(ios、istream、ostream、streambuf与iostream、cout关系,与iostream类库有关的头文件,iostream头文件中定义的流对象);
- C++输入/输出流:(两种输入/输出:单字符流/调用系统底层功能),标准输出流对象cout,其它输出流对象(cerr和clog标准错误流),标准输入流对象cin,使用格式控制符控制输出格式(也可以使用格式操作函数,可以同时设置两个属性),用流对象的成员函数控制输出格式(flags、setf、unsetf、setf、width、fill、precision),用流成员函数put输出字符串(输出单字符),用于字符输入的流成员函数(get和getline),istream类其他成员函数(eof、peek、putback、ignore);
- 重载“<<”和“>>”:重载“<<”和“>>”格式与应用方法;
- C++文件输入/输出流:文件的输出(ofstream文件打开、数据写入、关闭),文件的输入(ofstream文件打开、数据写入、关闭)
十六、文件操作
- 文件概述:插入器(<<),析取器(>>);
- 文件的打开与关闭:(打开与关闭就是建立和断开指针与文件的关系),文件的打开(open、fstream、ifstream和ofstream),文件关闭;
- 文件的读写:C++文件的读写方法(ostream、istream与<<、>>,get、put,read、write),文本文件的读写,文件的定位(seekg与seekp移动指针,tellg与tellp取得指针位置),二进制文件的读写(二进制文件必须使用数据块读取方式)
十七、命名空间
- 命名空间概述:命名空间要解决的问题、命名空间用法;
- 定义命名空间:嵌套定义命名空间(多次定义添加新成员);
- 实体的作用域与可见域:变量生存期(自动分配—栈、静态分配—预分配、动态存储),作用域、可见域、局部作用域({}人为构造局部作用域)、全局作用域和域操作符(编译器将域操作符修饰的变量视为全局变量),作用域嵌套及可见性;
- 使用命名空间:作用域解析运算符(域操作符::与:的区分),using指令简化对命名空间中名称使用(using指令与using声明)
十八、异常和错误处理
- 编码时的防错:使用断言(assert),调用exit、abort、_Exit和atexit函数(atexit挂接函数地址),返回错误标志;
- 异常机制:(throw~try…catch语句),异常的抛出(throw可抛出预置数据类型和自定义数据类型),异常的捕获(异常会找最近的try-catch语句去处理),异常的处理,terminate函数和set_terminate函数(异常未被捕获时terminate()自动调用),unexpected函数和set_unexpected函数(异常多抛出时unexpected()自动调用),标准异常(exception、logic_erro和runtime_error);
- 关于异常处理的进一步讨论:异常规范(throw和异常类型类表),堆栈解退(异常处理和函数返回对堆栈里内容处理的区别),构造函数、析构函数中的异常处理;
- auto_ptr类:(智能指针,用以防止内存泄漏)使用auto_ptr类(auto_ptr对象定义和5种使用情况),auto_ptr使用说明