C++簡單實現string類

面試經常會考到的類型,主要考的是幾個構造函數和重載運算符,簡單的實現一下

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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章