前言
二面通过,不过因为学校不好,那边也不愿给我太高的薪资,说平薪,然后我也没去。
一面
笔试
1.CMyString的实现
class CMyString
{
public:
CMyString(char* pData = nullptr)
{
m_pData = nullptr;
if (pData == nullptr)
{
return;
}
int length = strlen(pData) + 1;
m_pData = new char[length];//肯定要new的,pData可能是const的字符串
if (m_pData == nullptr) return;
memcpy(m_pData, pData, length);
}
CMyString(const CMyString& str)
{
if (&str == this) return;
if (str.m_pData == NULL)
{
m_pData = NULL;
}
else
{
size_t length = strlen(str.m_pData);
m_pData = new char[length + 1];
memset(m_pData, 0, sizeof(char) * (length + 1));
memcpy(m_pData, str.m_pData, length);
}
}
CMyString& operator=(const CMyString& str)
{
if (this != &str)
{
//这种方式可以保证异常安全性。
CMyString strTemp(str);//调用拷贝构造
char* pTemp = strTemp.m_pData;//将现有的已有的指针进行交换
strTemp.m_pData = m_pData;//将自己的指针交给strTemp,strTemp出了作用域就会被释放(会调用析构,会释放m_pData),
m_pData = pTemp;//现在指针指向了传递的str的m_pData
}
return *this;
}
CMyString& operator+(const CMyString& str)
{
if (str.m_pData == nullptr || &str == this)
return *this;
if (m_pData == nullptr)//如果当前的m_pData为空,直接赋值
m_pData = str.m_pData;
int length = strlen(m_pData) + strlen(str.m_pData) + 1;
char* temp = new char[length];
memset(temp, 0, length);//如果不初始化,不然会出现拼接的时候会出现一些乱码在中间,需要初始化
memcpy(temp, m_pData, strlen(m_pData));//拷贝自身的字符
strcat(temp, str.m_pData);//拼接str
if (m_pData != nullptr)
{
delete []m_pData;
m_pData = nullptr;
}
m_pData = temp;
return *this;
}
~CMyString()
{
if (m_pData != nullptr)
{
std::cout << "free:"<< m_pData << std::endl;
delete[]m_pData;
m_pData = nullptr;
}
}
char* GetData()
{
return m_pData;
}
private:
char* m_pData;
};
2.单例模式的实现
template<typename T>
class Singleton5
{
public:
static T& GetInstance()
{
static T instance;
return instance;
}
~Singleton5() { printf("~singleton5 is called\n"); }
protected:
Singleton5() {} // protected修饰构造函数,才能让别⼈继承,所以如果使用私有的,那就要使用friend,子类太多,要很多friend,不利于扩展
Singleton5(const Singleton5& clone) = delete;
Singleton5& operator= (const Singleton5& src) = delete;
};
class DesignSingletion :public Singleton5<DesignSingletion>
{
friend Singleton5<DesignSingletion>;//让父类Singleton5<T>为自己友元,可以访问自己的私有构造函数。
private:
DesignSingletion() {}
DesignSingletion(const DesignSingletion& clone) = delete;
DesignSingletion& operator= (const DesignSingletion& src) = delete;
};
3.创建线程 //使用pthread或者std::thread,2者实现更好
pthread_create
std::thread
面试
1.const ,static关键字的用法
2.virtual关键字
3.进程间通信
4.QT信号槽,要实现信号槽函数要注意什么(**我回到的是继承QObject和_OBJECT关键字?**)
5.使用过QT开发过什么软件
6.使用过哪些QT控件
7.有写过继承类吗(一脸疑惑?工作2年,难道我写的所有类都是光杆司令,都不继承吗?)
8.项目相关的(RTP,RTSP协议的作用)
9.工作中遇到什么难题
二面
1.自我介绍
2.你开发过程遇到的最大问题
3.你的最大缺点
4.你的职业规划
5.你现在的工作职责
6.你觉得除了QT适合开发的界面技术,还有其他更加先进的界面开发技术吗
7.你离职过后的工作怎么处理
8.你还有什么想问的吗