C++中对象给自身赋值有些需要注意的?解决办法
C++中对象给自身赋值有些需要注意的??
//赋值函数,把对象source的副本nbegin到nend间的字符赋值给调用此函数的对象中的m_str。
MyString& MyString::assign(const MyString &source, unsigned int nBegin, unsigned int nEnd)
{
if(nBegin > (unsigned)source.m_len || nEnd < nBegin)
{
throw "assign(const MyString &source, unsigned int nbegin, unsigned int nend)";
}
int l_Len = nEnd - nBegin;
if(l_Len > this->m_len)
{
char *pTemp = new char[l_Len + 1];
if(NULL == pTemp)
{
throw "error";
}
memcpy(pTemp, source.m_str + nBegin, l_Len);
pTemp[l_Len] = 0;
delete[] m_str;
this->m_str = pTemp;
this->m_len = l_Len;
}
else
{
memcpy(this->m_str, source.m_str + nBegin, l_Len);
this->m_str[l_Len] = 0;
this->m_len = l_Len;
}
return *this;
}
这是我自己写mystring类,这个函数实现的是赋值。
请问:若有对象str1;
以下操作会有什么问题:
str1.assign(str1,0,str1.length());
请大家多多帮助,谢谢各位!
------解决方案--------------------
没什么问题.唯一的缺点就是
memcpy(this->m_str, source.m_str + nBegin, l_Len);
this->m_str[l_Len] = 0;
this->m_len = l_Len;
会调用一遍这个函数.
有点效率问题.
改进方法:函数开头加一行
MyString& MyString::assign(const MyString &source, unsigned int nBegin, unsigned int nEnd)
{
if(this==&source)
return *this;
...
//赋值函数,把对象source的副本nbegin到nend间的字符赋值给调用此函数的对象中的m_str。
MyString& MyString::assign(const MyString &source, unsigned int nBegin, unsigned int nEnd)
{
if(nBegin > (unsigned)source.m_len || nEnd < nBegin)
{
throw "assign(const MyString &source, unsigned int nbegin, unsigned int nend)";
}
int l_Len = nEnd - nBegin;
if(l_Len > this->m_len)
{
char *pTemp = new char[l_Len + 1];
if(NULL == pTemp)
{
throw "error";
}
memcpy(pTemp, source.m_str + nBegin, l_Len);
pTemp[l_Len] = 0;
delete[] m_str;
this->m_str = pTemp;
this->m_len = l_Len;
}
else
{
memcpy(this->m_str, source.m_str + nBegin, l_Len);
this->m_str[l_Len] = 0;
this->m_len = l_Len;
}
return *this;
}
这是我自己写mystring类,这个函数实现的是赋值。
请问:若有对象str1;
以下操作会有什么问题:
str1.assign(str1,0,str1.length());
请大家多多帮助,谢谢各位!
------解决方案--------------------
没什么问题.唯一的缺点就是
memcpy(this->m_str, source.m_str + nBegin, l_Len);
this->m_str[l_Len] = 0;
this->m_len = l_Len;
会调用一遍这个函数.
有点效率问题.
改进方法:函数开头加一行
MyString& MyString::assign(const MyString &source, unsigned int nBegin, unsigned int nEnd)
{
if(this==&source)
return *this;
...