剑指offer——面试题1赋值运算符函数。
1. 赋值运算符函数
// 面试题1:赋值运算符函数
// 题目:如下为类型CMyString的声明,请为该类型添加赋值运算符函数。
#include <cstring> //strlen()
#include <cstdio>
class CMyString
{
public:
CMyString(char* pData = nullptr);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator= (const CMyString& str);
void Print();
private:
char* m_pData;
};
// CMyString::CMyString(char* pData = nullptr)//这里重复指定默认值报错
CMyString::CMyString(char* pData)//
{
if(pData == nullptr)
{
m_pData = new char[1];
// m_pData[0] = '/0';//重要,没有考虑到这一点。
m_pData[0] = '\0';//上方代码出错,应该写成\0,/0表示int类型
}
else
{
m_pData = new char[strlen(pData) + 1];
strcpy(m_pData,pData);
}
}
CMyString::CMyString(const CMyString& str)
{
m_pData = new char[strlen(str.m_pData) + 1];
m_pData = str.m_pData;
}
CMyString::~CMyString(void)
{
delete[] m_pData;
}
CMyString& CMyString::operator= (const CMyString& str)
{
if(this == &str)
return *this;
delete[] m_pData;
// m_pData = nullptr;//我不理解为什么这里要等于nullptr
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData,str.m_pData);
return *this;
}
- 完整代码去vscode看,这里只是少了测试代码。
原来代码中出错的地方:
m_pData[0] = '\0';//上方代码出错,应该写成\0,/0表示int类型
,在源代码中错误的写成='/0'
报两个错误,一个是Multi-character constant warning,即多字符常量,C++中字符常量应该是单一字符如a
、\0
等。/0
是一个多字符常量,类型为int
。第二个是Overflow warning
溢出警告,提示你从 int
转换到 char
时,值发生了溢出。'/0'
这个表达式实际上表示的是字符常量 '/'
和 '0'
的 ASCII 值组合('/'
是 47,'0'
是 48)。两个字符的合并会产生一个整数值 12080(即 47 * 256 + 48
),这个值无法放入 char
类型(因为 char
只有一个字节,最大值通常是 127 或 255)。
CMyString::CMyString(char* pData = nullptr)//这里重复指定默认值报错
,原因是在类的函数声明中已经指定默认值,在类的定义中或其他地方声明构造函数时,就不能再重复指定默认值