1.面向对象编程的三大特性
a.封装(代码模块化):将对象的属性和方法隐藏起来,仅对外公开接口部分。其中函数和数据都是类的成员。
b.继承(代码复用性):继承是类与类的关系,同现实世界的继承一样。被继承的类称为父类或基类,继承的类称为子类或派生类。派生类可以拥有基类的成员函数和成员数据,也可以自己定义新的数据成员。
继承的特性为:派生类可以赋值给基类;基类不可以赋值给派生类
基类的指针引用可以指向派生类;派生类的指针引用不可以指向基类。
继承分为公有继承:基类中的公有成员在派生类中为公有属性,基类中的保护成员在派生类中为保护属性
私有继承:基类中的公有成员和保护成员在派生类中为私有属性
保护继承:基类中的公有成员和保护成员在派生类中为保护属性
*基类中的私有成员在派生类中始终不可访问
c.多态(接口复用性):一个接口,多种方法。程序在运行时才决定要调用的函数。
多态实现的条件:基类中含有虚函数,在派生类中对虚函数进行重写
通过基类中的指针或引用来调用虚函数
多态产生的条件:基类中含有virtual修饰的虚函数
存在虚函数的表中有一个二维的虚函数叫做虚表。类的对象有一个指向虚表的指针
多态性就是一个接口的多种实现
STL模板库:
STL是一个标准模板库,是高效的C++程序库。主要依赖模板而不是三大特性,实现了代码的可复用性和高效性。
STL主要有三大组件:容器,适配器,算法(仿函数,迭代适配器,空间适配器)
容器有序列式容器和并联式容器
序列式容器(都可序,但未必有序):vector list deque string
vector:动态数组,可以调整其大小,要访问其中一个元素,时间复杂度为ON,尾插一个元素,时间复杂度为O1,任何改变vector长度的操作都会使原有的迭代器失效
list:实质上是一个双向链表,通过指针对元素进行访问,每次插入和删除一个元素,都会重新配置和释放一个元素空间。本质是不连续的,其插入和删除十分高效,且任意的插入和删除不会造成迭代器失效。
deque:双向开口的连续空间,可在头尾两端分别做元素的插入和删除操作,其中每一个元素都是由一个个小的空间连续组成的。
string:可看做是一个字符串,可以对其进行反转,增删查改,遍历等,但是在string中慎用memcpy和空指针。
并联式容器(没有头尾,只有最大值和最小值):map set
set:其键值就是实值,会根据键值进行排序
map:允许有键值和实值,会根据键值进行排序,但不允许不同的元素有相同的键值
他们两个的底层实现是二叉搜索树:二叉搜索树就是任何一个节点的键值一定大于其左子树的键值,且小于其右子树的键值实质是一个
muliti—允许有重复的键值,其底层实现是红黑树,红黑树就是其节点不是红色就是黑色,根结点一定是黑色,如果节点为红,其子节点一定为黑
智能指针:
C++常用new和delete来申请和释放内存,但是有时候会忘记delete而造成空间的内存泄漏,C++中用智能指针来管理动态内存,避免内存泄漏问题。头文件为
智能指针分别有:anto_ptr:这是一个比较古老的智能指针,对它所拥有的指针完全占有,通过引用来实现所有权的转移。
shared_ptr:允许多个指针同时拥有同一个对象,每个都有一个引用计数器,会自动释放所管理的内存,默认是一个空指针
unique_ptr:独占所拥有的对象,与对象共存亡
weak_ptr:实质是一个弱引用,不能直接访问对象对象,不能控制对象的生命周期