题目及源码

相关题目以及源码放在github仓库

keqiudi/Cpp_internal_exam (github.com)

相关知识点

线程池的实现

见线程池篇

线程池C++版 | Walnut🍭 (keqiudi.github.io)

线程池下的socket

分为两个部分:

  • 主线程中添加一个任务,单独让一个线程,进行一个任务,该任务处于循环中,一直检测是否有客户端连接。(该线程始终存在)
  • 如果连接成功,则每一次循环添加所需要工作的任务进线程池中,让其它线程进行处理。(可能管理者被销毁)

vector

此项目中,利用封装后的用户类放入vector容器中,用于保存数据。

  • 以下只有本项目中使用的函数
1
2
3
4
5
6
7
8
push_back()//尾部插入元素
emplace_back()//尾部插入元素
userList.emplace_back(userName,password,userType,realName);

pop_back()//删除最后一个元素

erase()//删除元素,允许使用迭代器
erase(userList.begin()+i-1)//删除第i个元素
  • emplace_back() 可以允许直接传入构造函数参数,直接在容器内部创建一个对象,示例见上方。

  • push_back()则是需要先用构造函数创建一个对象,再使用拷贝(复制)构造函数插入集合。

即:使用emplace_back()比常规的push_back()少调用了一次复制构造函数,可提高代码的效率

以下为vector详细用法:

运算符重载

需要的到一个全新对象对=进行重载时,返回值最好为引用类型

返回值不是引用的话有以下几个坏处:

  • 不能实现链式赋值,例如m1 = m2 = m3 = u这样的语句就会报错,因为m2 = m3 = u返回的是一个临时对象,不能再赋值给m1。
  • 会造成额外的拷贝开销,因为每次赋值都要创建一个新的对象,并调用拷贝构造函数和析构函数,这会降低程序的效率。
  • 会导致对象的一致性问题,因为赋值后的对象和原对象不是同一个对象,它们的地址不同,如果对其中一个对象进行修改,另一个对象不会受到影响。

1
2
3
4
5
6
7
8
9
10
11
12
Manager& operator=(User& user){
this->setUserName(user.getUserName());
this->setUserPassword(user.getUserPassword());
this->setUserRealName(user.getUserRealName());
this->setUserType(user.getUserType());
this->setUserSeatNumber(user.getUserSeatNumber());
this->setUserSeatStatus(user.getUserSeatStatus());
this->setUserGarbageTime(user.getUserGarbageTime());
this->setUserActivityNumber(user.getUserActivityNumber());
return *this;
};
//User对象赋值给一个Manager对象。这个运算符的返回值是一个Manager的引用,也就是*this

附上常用重载:

C++ 运算符重载_c++ 重载=_高祥xiang的博客-CSDN博客