实验室管理系统
题目及源码
相关题目以及源码放在github仓库
keqiudi/Cpp_internal_exam (github.com)
相关知识点
线程池的实现
见线程池篇
线程池C++版 | Walnut🍭 (keqiudi.github.io)
线程池下的socket
分为两个部分
:
- 主线程中添加一个任务,单独让一个线程,进行一个任务,该任务处于循环中,一直检测是否有客户端连接。(该线程始终存在)
- 如果连接成功,则每一次循环添加所需要工作的任务进线程池中,让其它线程进行处理。(可能管理者被销毁)
vector
此项目中,利用封装后的用户类放入vector容器中,用于保存数据。
- 以下只有本项目中使用的函数
1 | push_back()//尾部插入元素 |
-
emplace_back()
可以允许直接传入构造函数参数,直接在容器内部创建一个对象,示例见上方。 -
push_back()
则是需要先用构造函数创建一个对象,再使用拷贝(复制)构造函数插入集合。
即:使用emplace_back()
比常规的push_back()
少调用了一次复制构造函数,可提高代码的效率。
以下为vector详细用法:
运算符重载
需要的到一个全新对象对=进行重载时,返回值最好为引用类型
返回值不是引用的话有以下几个坏处:
- 不能实现链式赋值,例如m1 = m2 = m3 = u这样的语句就会报错,因为m2 = m3 = u返回的是一个临时对象,不能再赋值给m1。
- 会造成额外的拷贝开销,因为每次赋值都要创建一个新的对象,并调用拷贝构造函数和析构函数,这会降低程序的效率。
- 会导致对象的一致性问题,因为赋值后的对象和原对象不是同一个对象,它们的地址不同,如果对其中一个对象进行修改,另一个对象不会受到影响。
例
:
1 | Manager& operator=(User& user){ |
附上常用重载:
评论