题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
class CMyString { public: CMyString(char* pData = nullptr); CMyString(const CMyString& str); ~CMyString(void); private: char* m_pData; }
1. strcpy的处理学习
字符串最容易忘记的就是空字符的处理。先来定义两个构造函数:
CMyString::CMyString(char * pData)
{
// 如果传入的是空字符串
if (nullptr == pData)
{
m_pData = new char[1];
m_pData[0] = '\0';
}
else
{
size_t length = strlen(pData);
m_pData = new char[length + 1];
strcpy(m_pData, pData);
}
}
CMyString::CMyString(const CMyString & str)
{
size_t length = strlen(str.m_pData);
m_pData = new char[length + 1];
strcpy(m_pData, str.m_pData);
}
- 字符串:末尾要添加 ‘\0’ 标志结束,所以长度比真实长度多1。
- strcpy()和strcpy_s():如果使用前者,在VS 2017下,需要在开始处添加
#define _CRT_SECURE_NO_WARNINGS // 定义该常量,否则编译器报错“strcpy不安全”
2. 赋值运算符函数的实现
CMyString & CMyString::operator=(const CMyString & str)
{
if (&str != this)
{
delete[] m_pData;
m_pData = nullptr;
m_pData = new char[strlen(str.m_pData) + 1];
std::strcpy(m_pData, str.m_pData);
}
return *this;
}