面試經常會考到的類型,主要考的是幾個構造函數和重載運算符,簡單的實現一下
class CString
{
public:
CString();
~CString();
int Length()const{return m_len;}
CString(const char * const str);
CString(const CString &str);
char &operator[](int index)const;
CString &operator=(const CString & str);
//字符串輸出
friend ostream& operator<<(ostream &out, const CString &str)
{
out<<str.m_str;
return out;
}
private:
char *m_str;
int m_len;
};
//默認構造函數
CString::CString()
{
m_len = 0;
m_str = new char[1];
*m_str = '\0';
}
//析構函數
CString::~CString()
{
if (m_str != NULL)
{
delete[] m_str;
m_str = 0;
}
m_len = 0;
}
//重載構造函數
CString::CString( const char * const str )
{
if (str != NULL)
{
m_len = strlen(str);
m_str = new char[m_len + 1];
for (int i = 0; i < m_len; i++)
{
m_str[i] = str[i];
}
m_str[m_len] = '\0';
}
}
//複製構造函數實現深層拷貝
CString::CString( const CString &str )
{
m_len = strlen(str.m_str);
m_str = new char[m_len + 1];
for (int i = 0; i < m_len; i++)
{
m_str[i] = str[i];
}
m_str[m_len] = '\0';
}
//重載[]操作符
char &CString::operator[]( int index ) const
{
if (index > m_len)
{
return m_str[m_len];
}
if (index < 0)
{
return m_str[0];
}
return m_str[index];
}
//重載=操作符,實現兩個對象賦值
CString & CString::operator=( const CString & str )
{
//如果是自己對自己賦值,那直接返回自身
if (this == &str)
{
return *this;
}
//刪除舊的數據(=號左邊的對象數據)
if (m_str != NULL)
{
delete[] m_str;
}
m_len = str.Length();
m_str = new char[m_len + 1];
for (int i = 0; i < m_len; i++)
{
m_str[i] = str[i];
}
m_str[m_len] = '\0';
return *this;
}
int main()
{
//調用默認無參構造函數
CString c1;
//調用帶參構造函數
CString c2("HelloWorld");
//調用複製構造函數、[]運算符重載函數
CString c3 = c2;
//調用=運算符重載函數
c1 = c3;
//調用<<運算符操作函數
cout<<c1<<" "<<c2<<" "<<c3<<endl;
return 0;
}