1.主旨
- 这道题主要是为了考察赋值运算符的重载,已经对于指针变量的拷贝时,其自身内存的管理(清理与查重)
2.考点
- 考点1:拷贝构造函数的标准格式:CMyString& 之类的标准引用(用于实现连续赋值,即保证返回的参数能作为输入的参数);
- 考点2:拷贝构造函数的标准格式:(const CMyString& str)这样的常量引用传入参数,避免一次拷贝构造函数的调用;
- 考点3:是否在进行赋值之前释放了被赋予值的变量的内存:如果直接将指针赋予,则变成浅拷贝,但是原内存没有被释放,不安全;如果直接对内存进行替换,由于不知道两者内存前后大小如何。可能会造成问题;
- 考点4:判断传入的是否为自己:如果是自己则返回自己,否则在释放了自己的内存后,无法再使用自己存储的数据了。
- 考点5:delete[]:其与delete的区别是析构的是指针对象所指向的对象中的所有元素,逐一进行析构,而delete只会析构一个,比如数组的首元素
3.代码
#include<cstring>
#include<cstdio>
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
private:
char* m_pData;
};
CMyString::CMyString(char *pData)
{
if (pData == nullptr)
{
m_pData = new char[1];
m_pData[0] = '\0';
}
else
{
int length = strlen(pData);
m_pData = new char[length + 1];
*m_pData = *pData;
}
}
CMyString::CMyString(const CMyString &str)
{
int length = strlen(str.m_pData);
m_pData = new char[length + 1];
*m_pData = *(str.m_pData);
}
CMyString::~CMyString()
{
delete[] m_pData;
}
CMyString& CMyString::operator = (const CMyString& str)
{
if (this == &str)
return *this;
delete[] m_pData;
m_pData = nullptr;
m_pData = new char[strlen(str.m_pData) + 1];
*m_pData = *(str.m_pData);
return *this;
}