面试经常会考到的类型,主要考的是几个构造函数和重载运算符,简单的实现一下
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;
}