面試官讓你現場寫一個string類,該寫哪個版本的?
阿新 • • 發佈:2019-01-29
之前的 文章中,我們詳細介紹過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;
};