1. 面向对象程序设计
-
主要特征
程序 = 过程设计 + 过程调用
-
结构特点
1) 程序 = 类的定义 + 类的使用 2) 程序中的一切操作都是通过向对象发送消息来实现的,对象接收到消息后,启动有关方法完成相应的操作
-
对象 = 数据 + 操作
-
基本特征
抽象、封装、继承、多态
2. C++基础——模糊点
Const 修饰符
- 指向常量的指针——一个指向常量的指针变量
# 可以改变指针指向的地址,但不能改变指针所指的变量
const char* pc = "abcd";
pc = 'rvfs'; √
pc[3] = 'x'; ×
- 常指针——将指针变量所指的地址声明为常量
# 可以修改指针所指向的内容,但不能更改指向的地址
char* const pc = "abcd";
pc[3] = 'x'; √
pc = 'dsff'; ×
- 指向常量的常指针
# 指针所指向的内容和地址都不可修改
const char* const pc = "abcd";
函数重载
使用条件:同一作用域下,函数参数的类型不同,或者参数的个数不同,或者二者兼而有
int add(int x, int y)
{
return x + y;
}
double add(double x, double y)
{
return x + y;
}
int add(int x, int y, int z)
{
return x + y + z;
}
作用域标识符 ::
当遇到两个同名变量,一个为局部变量,一个为全局变量时,局部变量的优先级更高,会对全局变量进行覆盖
如想在局部变量的作用域中使用全局变量,可在全局变量前加 "::"
引用
引用与其所代表的变量共享同一内存单元,系统并不为引用另外分配存储空间。
即引用和其代表的变量具有相同的地址。
3. 类和对象
类的构成
1)一般情况下,一个类的数据成员应该声明为私有成员,成员函数声明为共有成员;
2)类声明中的关键字private、protected、public可以任意顺序出现。如果一个类体中没有访问权限关键字,则其中的数据成员和成员函数都默认为私有的。
3)不能在类声明中给数据成员赋初值
class 类名{
public: # 公共
公有数据成员;
公有成员函数;
protected: # 保护
保护数据成员;
保护成员函数;
private: # 私有,只能被类中的成员函数访问,不能在类的外部,通过类的对象进行访问
私有数据成员;
私有成员函数;
};
成员函数定义
返回值类型 类名::成员函数名(参数表){ 函数体}
声明方式可分为隐式(成员函数直接在类内部进行定义)和显式(类声明中只给出成员函数原型,将定义放在类的外部)。
此外,在使用inline定义内联函数时,必须将类的声明和内联成员函数的定义都放在同一个(头)文件中。
共享数据的保护
常引用,所引用的对象不能更新
const 类型& 引用名
常对象:数据成员为常量,且必须有初值
类名 const 对象名[(参数表)]
常对象成员
1. 常数据成员:构造函数就只能通过成员初始化列表对该数据成员进行初始化,而任何其他函数都不能对该成员赋值
2. 常成员函数:声明函数和定义函数时都要有关键字const。在调用时不必加const
4. 继承与派生
派生类是基类的具体化,而基类则是派生类的抽象
派生类对基类成员的访问
1. 内部访问:派生类中新增的成员函数对基类继承来的成员进行访问
2. 外部访问:通过派生类的对象对基类继承来的成员进行访问
派生类和基类的调用顺序
1. 构造函数的调用:先调用基类的构造函数,后调用派生类的构造函数的顺序执行。
2. 析构函数的调用:先调用派生类的析构函数,后调用基类的析构函数。
5. 多态性与虚函数
多态
- 编译时多态性的实现
函数重载和运算符重载(静态连编)
- 运行时多态性的实现
虚函数(动态连编)
虚函数
格式
virtual 返回类型 函数名(形参表) {
函数体
}
虚析构函数
virtual ~类名(){
·····
}
纯虚函数
作用:在基类中为其派生类保留一个函数的名字,以便派生类根据需要重新定义。
virtual 函数类型 函数名(参数表) = 0;
6. 函数模板与类模板
类模板
类模板体外定义的成员函数一般形式
template <typename 类型参数>
函数类型 类名<类型参数>::成员函数名(形参表)
{
·····
}
7. STL标准模板库
vector
-
功能与数组类似,但数据在堆上进行存储,且可以进行动态扩展,增加长度
注:动态扩展,并不是在原空间之后续接新空间,而是找到比原来更大的内存空间,将原数据拷贝到新空间,释放原空间
-
容器的容量存在一定的随机性,但一定是大于等于容器的大小。
list容器
list容器实质是一个双向链表,可以高效地进行插入删除元素
stack栈
一种后进先出的元素序列,访问和删除都只能对栈顶的元素(即最后一个被加入栈的元素)进行,并且元素也只能被添加到栈顶
queue
具有先进先出的特性,只能在队的前端进行删除, 在队的后端进行插入
优先队列priority_queue
priority_queue允许用户为队列中元素设置优先级,放置元素的时候不是直接放到队尾,而是放置到比它优先级低的元素前面。
priority_queue<Type, Container, Functional>
Type,数据类型
Container,保存数据的容器,默认Vector,可省略
Functional,元素比较方式,默认less算子,可省略
双端队列deque
由一段一段的定量连续空间构成,第一个区块朝某个方向扩展,最后一个区块朝相反方向扩展;
管理这些分段的定量连续空间,维护其整体连续的假象,并提供随机存取的接口;
set
只有一个键值,底层使用一种平衡检索二叉树——红黑树进行构造。
默认比较器less
map
将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)。
具有对数据自动排序的功能,map内部的数据都是有序的。
默认比较器 less(>=)