c++基础知识3

    • 运算符重载

函数重载:函数名相同,函数功能相似、参数不同(参数个数、参数数据类型、参数类型的顺序)、与返回值类型无关的一组函数

同理:运算符重载:运算符一样,操作数的类型不同的这样子,成为运算符重载!

为什么要进行运算符重载:当我们要对自己定义的数据类型进行运算符的时候,编译器识别不了,所以没法进行,这时就需要我们自己来写对应的运算符计算的规则

运算符重载需要注意:运算符对应的操作数有几个,重载完之后操作数的个数是不能发生变化的!

重载的方式:两种

一种是成员函数进行重载:因为成员函数有this指针,this指的是对象本身,对象本身可以组为一个操作数,只需要提供一个操作数即可!(参数只有1个,就是第二个操作数)

一种是友元函数进行重载:因为没有this指针,需要两个参数作为操作数!

总结:友元重载比成员函数重载多一个操作数参数!

运算符重载的格式:

返回值类型Operator 运算符符号(参数列表){}

1.1+运算符重载—友元重载

什么时候执行拷贝构造函数: 类对象做函数参数、返回值、已经存在的对象赋值给这个在创建的对象!

1.2左移运算符重载

第一个参数必须是cout,第二个参数是需要输出的内容

1.3前++运算符的重载—友元重载

1.4后++运算符重载—友元重载

总结:

不是所有的运算符都可以使用友元函数和成员函数进行重载。例如作业运算符只能使用友元进行重载,=运算符只能使用成员函数进行重载!

    • 模板:函数模板、类模板

2.1函数模板

C++中很多代码都是模板,支持模板编程---泛型编程---数据类型参数化

格式: template<typename/class 自己写的数据类型名字>

函数类型 函数名(参数列表){}

2.2类模板

链表类:是由节点组成

总结:类模板中的所有成员函数都是模板;

    • C++中标准模板库STL

C++中由提供一个标准的模板库:里面都是用模板去实现的!

STL:标准模板库

STL中由提供算法,算法都是函数模板去实现的

STL中由提供类模板,主要是一些容器类模板的使用

3.1 vector—向量—动态数组

从结构上回答、特点

Vector:向量 ---数组

和之前数组特点是一样,唯一不同的是容量是可变的!

Vector的使用:

#include <vector>

  1. 插入:

  1. 访问

  1. 修改、删除

  1. 清空

    • STL中的list容器

List的结构:双向循环链表的结构 节点:一个数据域、两个指针域

插入:

访问:

删除:

拼接:

    • STL中的map容器

Map的结构: 底层 红黑树或者二叉树

哈希表

一个key对应一个value的值,一一对应的关系

Map<key, value> 这里的key和value的类型只要是C++中允许的数据类型,都ok!

Map的特点:查找速度非常快,根据key自动排序:从小到大

应用:#include<map>

访问:

    • 继承

解决问题:减少代码冗余(重复代码),让新写的代码可以重复使用已经有的代码、提高开发效率!

何时使用继承:当子类是父类的一种特殊版本的时候们,可让子类去继承父类!就可以使用继承!

继承如何继承:子类去继承父类,会继承了父类的所有成员(数据成员和成员函数!)友元是否会被继承?友元是不会被继承的,没有传递性!

构造和析构函数是不会被继承

继承的格式

Class 子类名:继承方式 父类的名字

{};

继承方式有3种, public(一般使用这种方式)、private、protected

总结:

  1. 父类的public成员只有采用public继承才可以继续在类内、类外可以访问

  1. 父类的protected成员不管使用哪种继承方式,都是只能在子类内访问

  1. 父类的private成员,不管使用哪种继承方式,在子类中都不可访问!

综上所述,我们的继承都采用public继承方式!

6.1多层继承

A类—》B类—》C类—》D类

  1. 构造的执行顺序:先父类再子类

  1. 析构的执行顺序:先构造的析构

隐藏的概念

隐藏(重定义):子类定义了一个和父类同名的函数!

什么时候需要重定义:当从父类继承下来的成员函数实现的效果满足不了子类对应的需求的时候,就可以重定义这个函数!

6.2多重继承

A类--》B类

--》C类

--》D类·

类B继承于类A,类C继承于类A,类D继承于类B和类C;这样子就会导致类D中拥有两份的类A中的数据成员,访问的时候就会出现访问不明确的问题。

解决:类B虚继承类A,类C虚继承类A!

7.多态的概念

C++中的多态: 调用一个函数,函数名相同,传入不同参数的时候,执行的就是不同的函数!

函数重载其实就是多态!

静态多态和动态多态

函数重载是一种静态多态!

什么是静态(静态库):在编译阶段就会把静态库加载到可执行文件中

什么是动态(动态库):在运行阶段就会把动态库加载到可执行文件中

总结 静态多态(编译阶段)和动态多态(运行阶段)的区别:链接的阶段是不一样的

什么是虚函数:就是在函数首部前面加上一个关键字:virtual

总结一下动态多态的实现条件:

  1. 有继承关系,一个父类有多个子类

  1. 父类有虚函数,子类有重写父类的虚函数

  1. 用父类的指针或者引用去操作子类对象,调用虚函数从而触发这个多态的!

动态多态的实现原理

一个类中如果有虚函数,那么这个类会有一张虚函数表那么这个虚函数表中存的是虚函数的地址!

子类继承了父类,子类中也有一张虚函数表,虚函数表中存的就是虚函数的地址!如果子类不重写父类的虚函数,那么虚函数表中存的是父类的虚函数的地址;如果子类重写了父类的虚函数,虚函数表中保存的地址变成了子类重写后的这个函数地址!

调用函数的时候就去虚函数表中找对应的函数去执行!

当我们创建子类对象的时候,如果这个类有虚函数,就会额外的多4个字节来保存虚函数表在内存中的起始地址!额外体现在:先给虚函数表分配内存空间,在给父类成员分配空间,最后才是子类自己的数据成员分配空间!

如图所示:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值