c++ : 命名空间,auto声明, decltype, 自动类型和类型推理. new/delete, 模板类:vector,array ,遍历for循环,默认参数,函数重载,函数模板,类构造,析构函数,this指针,友元函数,友元类,类的自动转换,类静态变量和函数,类继承,继承方式,访问控制,拷贝构造,虚函数,纯虚函数,虚拟继承,继承构造函数和析构函数调用. 运算符重载,类模板. 异常. 匿名对象, 匿名函数,伪函数,初始化方式,包装器 . 引用. 静态断言.
数据处理
各种数据类型的内存大小
const限定符,申明的变量时真正的常量,和c不同
数据强制类型转换, 2种方式,使用c方式cpp static_cast<typename>(value)
cpp 风格数组,字符串初始化{}
cpp string类 :和c数组类似,cin输入,cout输出,数组方式访问字符
cpp 结构体. 和c类似
cpp 共用体. 只能包含一种数据类型,和结构体类似.匿名共用体:成员位于相同的地址. 常用语节约内存
cpp 枚举体. 提供了一种创建符号常量的方式.枚举体变量只能通过枚举体内部成员赋值,对于枚举量,只定义了赋值运算符其他对枚举量与枚举量之间的运算符将失败. 但枚举量和其他变量能进行一些运算
cpp new和delete基本规则;delete只能用来释放new申请的内存,delete不能对同一个内存释放多次,通过new[]方式为数组申请的内存需要delete[]来释放,为实体申请内存需要delete释放
存储方式:自动存储,静态存储,动态存储
模板类vector基本用法和array数组类似. 方法push_back()在最后面添加项 begin() 返回指针 指向这个容器的开头, 可以*取数据,也可以++直到==.end() 同理, rbegin() , rend() 反向遍历. 方法at(i)和[]一样, assign() 指定值, resize()重设大小
cpp数组 array<类型,大小> 数组名 {初始化};
循环和关系表达式
略过,和c一样
函数
引用变量.本质是指针,别名方式操作变量.
auto, 函数指针, const混用
内联函数原理, 不使用普通函数的跳转,跳回,通过内联代码的方式节约运行时间,提高效率但是会增加内存开销. 要使用内联函数需要满足条件: 1.函数声明和定义出都需要加inline修饰
默认参数
函数重载
函数模板, auto , decltype()
内存模型和命名空间
存储区, 变量作用域, 变脸链接性.
内存分配. new 初始化
命名空间: 定义命名空间, 应用其他命名空间的变量时, 需要通过命名空间名:: 来引用 . 解决全局变量冲突, 将全局变量放在不同的命令空间. namespace name1{} namespace name2{} 命令空间叠加. 多级命名空间, name1::name2::name3:: ……..
对象和类
1. 内联方法, 在类内部定义自动为内联方法,在类外面定义通过inline 声明
2. 构造函数和析构函数: 构造函数重载, 默认构造函数. 对象初始化方式My m={构造函数参数实参}; const型的对象不能调用函数除非在函数()后面写上const,这样这个函数里面的左值都是const型了
3. 友元函数: 用于外部函数访问类的私有变量. 需要在类内部进行friend声明,函数在类外部定义
4. 友元类: 当a类是另b类的友元类时, a类所有成员函数都是b类的友元函数
explicit: 标记构造函数中不能自动类型转换,可以强制转换
5. 拷贝构造函数: 本质上是类成员属性复制, 对象复制, 深拷贝用于存在动态分配的类成员
6.对象动态创建. 使用new, 需要delete删除其次需要在析构函数中delete掉动态分配的内存
7.类与类之间类型转换和类转基本数据类型. 方式: 构造函数转换, =重载, operator 类型(){} 函数. 当对象赋值给基本数据类型变量时,自动调用operator函数,将返回值给该变量.本质上都是成员属性,变量之间赋值
8.类继承与类关系: is-a, use-a, has-a. : use-a是在一个类中定义另一个类的对象. has-a : 在一个类中定义一个类,可以使用这个类所有东西. is-a : 继承.
9继承,继承方式public,protected, private. 基类中的私有成员在派生类中均为不可访问。其他成员总是在自身访问属性和继承方式中选择较严格者作为派生类中成员的访问属性。 继承本质,继承会将父类所有成员复制过来但超出权限部分不可访问. 如果重名,将不会重写父类的成员.可以通过子类对象.父类名::父类属性 访问. 构造函数的调用规则 : 调用多个基类的构造函数,调用顺序按照它们被继承时声明的顺序. 若基类中未定义构造函数,派生类中也可以不定义,全采用默认构造函数 . 当基类定义有带形参的构造函数时,派生类也应定义有参构造函数,提供将参数传递给基类构造函数的途径 . 析构函数的调用次序与构造函数相反
10.虚函数: 如果没有virtual,所有父类类型的变量都调用父类函数,即使有,也只是指针才调用所属对象的 函数
C++中有继承关系的类对象内存的布局:在C++中,如果类中有虚函数,那么它就会有一个虚函数表的指针__vfptr,该指针在类对象最开始的内存数据中。之后是类中的成员变量的内存数据。 构造函数不能是虚函数,析构函数在父类指针指向子类对象时必须是虚函数. 继承后,在子类中这些虚函数任然是虚函数. 如果子类定义同名的虚函数,将覆盖继承过来的虚函数
纯虚函数和抽象类. 类里面只要有纯虚函数就是抽象类,不能实例化.继承抽象后需要对抽象的所有纯虚函数重写,否则该类还是一个纯虚函数.
11.final 和 override 前者修饰的虚函数不能被重写,一般将重写的虚函数使用override修饰
12 虚继承,不影响函数类的属性,只是影响所占内存大小
运算符重载
1.结构: <返回类型说明符> operator 运算符 (<参数表>){ <函数体> }
2.在哪里实现? 作为类成员函数, 作为全局函数并作为友元函数
3.重载方式: 单目运算符, 作为类成员函数0个参数, 作为全局函数并作为友元函数
1个参数. 双目运算符, 作为类成员函数1个参数, 作为全局函数并作为友元函数
2个参数. 其他类推.