CMyString& CMyString::operator=(const CMyString& Str)
{
cout<<"equals"<<endl;
if (this != &Str)
{
CMyString strTemp(Str);
char* pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pTemp;
}
return *this;
/* if (&Str == this)
return *this;
if (m_pData != NULL)
{
delete []m_pData;//如果是自身赋值,则此处字符串内存被释放掉,后边不能被引用
m_pData = NULL;
}
m_pData = new char[strlen(Str.m_pData) + 1];//如果是自身赋值,则之前字符串内存被释放掉,此处不能被引用
strcpy(m_pData, Str.m_pData);
return *this;
*/
{
cout<<"equals"<<endl;
if (this != &Str)
{
CMyString strTemp(Str);
char* pTemp = strTemp.m_pData;
strTemp.m_pData = m_pData;
m_pData = pTemp;
}
return *this;
/* if (&Str == this)
return *this;
if (m_pData != NULL)
{
delete []m_pData;//如果是自身赋值,则此处字符串内存被释放掉,后边不能被引用
m_pData = NULL;
}
m_pData = new char[strlen(Str.m_pData) + 1];//如果是自身赋值,则之前字符串内存被释放掉,此处不能被引用
strcpy(m_pData, Str.m_pData);
return *this;
*/
}
看剑指offer分析赋值操作符,非屏蔽部分通过创建一个临时实例,把可能出现破坏了却没更新的情况甩给了临时变量,而且如果可以成功的话通过二者指针间的互换自身的指针变量可以自动消除。。可以可以!
四部分
返回值声明为引用类型
形参为常量引用
释放自身内存
判断防止自身赋值
其中三四点的问题可以右本文中的临时变量一并解决,啊哈哈