class CMyString
{
public:
CMyString(char *pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
//private:
char* m_pData;
} ;
CMyString::CMyString(char *pData)
{
if(pData == NULL)
{
m_pData = new char[1];
m_pData[0] = '\0';
}
else
{
m_pData = new char[strlen(pData)+1];
strcpy(m_pData,pData);
}
}
CMyString::CMyString(const CMyString& mstr)
{
this -> m_pData = new char[strlen(mstr.m_pData) + 1];
strcpy(m_pData,mstr.m_pData);
}
CMyString::~CMyString(void)
{
delete []m_pData;
}
/*
//初级版本
CMyString& CMyString::operator = (const CMyString& str)
{
if(this == &str)
{
return *this;
}
delete []m_pData; //释放掉原有内存
m_pData = NULL;
m_pData = new char[strlen(str.m_pData) + 1];
strcpy(m_pData,str.m_pData);
return (*this);
}
*/
//无敌改进版
CMyString& CMyString::operator = (const CMyString& mstr)
{
if(this == &mstr)
{
return *this;
}
CMyString tempString(mstr);
char *temp = tempString.m_pData;
tempString.m_pData = this -> m_pData;
this -> m_pData = temp;
return *this;
}
测试程序:
int main()
{
char *str = "hello";
CMyString s1(str);
CMyString s2;
s2 = s1;
cout << s2.m_pData << endl;
}
运行结果:
另外需要注意的是,刚刚在使用构造函数的缺省参数时,是这样定义的:
<span style="font-size:18px;">class CMyString
{
public:
CMyString(char *pData = NULL);
CMyString(const CMyString& str);
~CMyString(void);
CMyString& operator = (const CMyString& str);
//private:
char* m_pData;
} ;</span>
然后在定义构造函数时,按照如下定义方式:
<span style="font-size:18px;">CMyString::CMyString(char *pData = NULL)
{
if(pData == NULL)
{
m_pData = new char[1];
m_pData[0] = '\0';
}
else
{
m_pData = new char[strlen(pData)+1];
strcpy(m_pData,pData);
}
}</span>
结果程序报错了!
在网上查找资料后,发现:
既可以在类的声明中,或者也可以在函数定义中声明缺省参数。但是,不能既在类声明中又在函数定义中同时声明缺省参数。如果两者都声明的话,就像我上面一样,编译器是无法正确编译的。