------------------------------------------------------------------------
空指针:
野指针:
------------------------------------------------------------------------
一、温故知新
运算符重载
本质上就是函数的重载
语法
返回值 operator 运算符(参数列表)
{
函数主体
}
作用
定义类可以进行其所支持的运算符的运算
不支持重载的运算符
sizeof
::
? :
.
#
##
形式
作为类的成员函数出现
[]
()
=
->
全局函数,作为类的友元函数
<<
>>
因为输入输出运算是istream和ostream类的成员函数,我们没有办法去改变,所以需要作为类的友元函数来实现。
注意:
1、不能改变运算符的运算规则
2、不能改变运算符的优先级
二、模板(Template)
1、简介
模板是为了泛型编程,泛型编程是一种使用模板来编写程序的方式,可以让程序员编写与具体数据类型无关的代码,这种方式可以最大限度地提高代码的复用性和灵活性。
泛型编程理解为广泛类型
函数的参数可以在函数调用的时候指定,函数在当以的时候参数是通用的
2、回顾C
在C语言中实现一个能够适配任意类型的数组的排序(要求排序算法无所谓,但一定是任意类型的数据都可以排序)
函数名: | sort | |
参数: | arr | 数组起始地址(由于是任意类型,所以使用void *) |
nmemb | 数组成员个数 | |
size | 一个成员的大小 | |
cmp | 函数指针,指向调用者提供的比较函数(只有在调用的时候才能确定比较双方的类型) | |
返回值: | 空 | |
void sort (void *arr, int nmemb, size_t size, int (*cmp)(const void*, const void*)); |
3、C++实现通用函数
template <typename T>
void swap2num(T& t1, T& t2)
这种方式叫做模板函数,也就是参数类型在函数定义的时候是通用的,在函数调用的时候才确定的数据类型。
使用C++的方式实现更方便一些。
4、模板函数
利用模板函数,我们可以在相同的代码中指定不同类型的参数执行该功能
1)定义形式
模板函数定义的形式:
template <typename type>
函数返回值类型 函数名(参数列表)
{
函数的主体
}
// 也可以写成
template <class type>
{
函数的主体
}
四、类的模板
1、简介
类的成员变量类型,在实例化对象的时候才能确定
2、例子
定义一个坐标类Point
我们在表述这个坐标类的属性的时候可以使用
【1】整形的 [100,200]
【2】浮点型的 [1.2, 3.4]
【3】经纬度坐标(字符串) ["北纬39°", "东经116°"]
----------------------------------------------------------------------------
本初子午线(0度经线)为分界线,往东(右)为东经,往西(左)为西经,递增,一直递增到180°相遇。
南北纬以赤道为界,从赤道到北极部分为北纬,到南极部分为南纬。
----------------------------------------------------------------------------
我们对于这个坐标类有3种不同的类型:
【1】整型【2】浮点型【3】字符串
所以我们在创建坐标这个类的时候不能确定各这个类的成员变量具体是什么类型的
只能在实例化对象的时候确定成员变量是什么类型。
注意:在使用模板库的时候,我们不需要创建.cpp文件,因为模板类的成员函数要求必须和模板类在同一个文件中进行定义,也就是说,我们单独在一个文件中实现模板类的成员函数是编译不过去的。
五、数据结构
1、数据结构的分类
数据结构分为逻辑结构和物理结构
【1】逻辑结构:指数据元素之间的逻辑关系
【2】物理存储结构:指数据在存储空间中的存放形式
2、数据的逻辑结构
【1】集合结构:集合中任何两个元素之间都没有逻辑关系
【2】线性结构:指的是元素与元素之间存在“一对一”的关系
【3】树状结构:指的是元素与元素之间存在“一对多”的关系
【4】图形结构:指的是元素与元素之间存在“多对多”的关系
在C++中对于我们常见的数据结构,都有标准的类,这个类都是模板类。
其中线性结构是我们最熟悉的,比如:
[1]数组(顺序表)
[2]链表(单双、是否循环、有头无头)
[3]树状结构
二叉树、满二叉树、完全二叉树、平衡二叉树、红黑树
3、特殊的存储结构
[1]栈式存储结构(先进后出)
[2]队列式存储结构(先进先出)
4、构建双向链表
1)成员变量
【1】指向前驱节点的指针
【2】指向后继节点的指针
【3】数据域
2)成员函数
【1】构造函数
【2】析构函数
【3】头插法
【4】尾插法
【5】遍历
【6】查找
【7】删除指定元素
【8】修改
【9】反转
【10】排序
template <typename T>
class ListNode
{
public :
ListNode<T>* prev;
ListNode<T>* next;
T _data;
public :
ListNode(const T& data) : _data(data), _prev(nullptr), _next(nullptr) {};
};
六、任务
1、通信方式
有线通信
以太网
RS232和RS485(工业领域中常用的总线)
TTL 0V 0 3.3V 1
RS232 3V~12V 0 -12V~-3V 1
RS485
PLC(电力线通信)
无线通信
短距离无线通信
蓝牙
WIFI
zigbee
蜂窝移动网络
3G
4G
5G
低功耗广域网络
NB-IoT
Lora
ModBus协议