之前的 文章中,我们详细介绍过string类的深浅拷贝的实现以及引用计数,那么如果,在面试过程中你该给面试官展示哪一种string类呢?
今天我们就来写两个适合面试中写的string类
1,深拷贝
class MyString
{
public:
MyString(char* str = "")
:_str(new char[strlen(str) + 1])
{
strcpy(_str, str);
}
MyString(const MyString& s)
:_str(new char[strlen(s._str)+1])
{
strcpy(_str, s._str);
}
MyString& operator=(const MyString& s)
{
if (_str)
{
delete _str;
_str = new char[strlen(s._str) + 1];
strcpy(_str, s._str);
}
return *this;
}
~MyString()
{
if (_str)
{
delete _str;
_str = NULL;
}
}
char& operator[](size_t pos)
{
assert(pos);
return _str[pos];
}
bool operator > (const MyString& s)
{
const char* str1 = _str;
const char* str2 = s._str;
return str1 > s._str;
}
private:
char* _str;
};
2,若是时间充裕,且你能讲清楚关于引用计数的实现时,就可以展示一个基于引用计数的string类
class String
{
public:
String(const char* str = "")
{
if (str == NULL)
{
_str = new char[strlen(str) + 1 + 4];
(*(int*)_str) = 1;
_str = (char*)(((int*)_str) + 1);
*_str = '\0';
}
else
{
_str = new char[strlen(str) + 1 + 4];
strcpy(_str, str);
*((int *)_str - 1) = 1;
}
}
String(const String& s)
:_str(s._str)
{
++GetCount();
}
String& operator = (const String& s)
{
if (this != &s)
{
Release();
_str = s._str;
--GetCount();
}
}
char& operator[](size_t index)
{
if (GetCount() > 1)
{
char *pTmp = new char[strlen(_str) + 1 + 4];
strcpy(pTmp + 4, _str);
--GetCount();
_str = pTmp + 4;
GetCount() = 1;
}
return _str[index];
}
const char & operator[](size_t index)const
{
return _str[index];
}
friend ostream operator<<(ostream& output, const String& s)
{
output << s._pStr;
return output;
}
protected:
//引用计数
int& GetCount()
{
return *((int*)_str - 1);
}
void Release()
{
if (_str && (--GetCount() == 0))
{
_str = (char*)((int*)_str - 1);
delete _str;
_str = NULL;
}
}
private:
char* _str;
};
详细的知识戳链接:string的深浅拷贝和引用计数