簡化的string類的模擬

#include <iostream>
#include <string>
#include <ctime>
#include <stdexcept>
#include <iterator>
#include <vector>
#include <algorithm>
#include <functional>
#include <map>
#include <numeric>
#include <deque>
using namespace std;

class String {
	friend ostream &operator<<(ostream &os, const String &str);
	friend istream &operator>>(istream &is, String &str);

public:
	String();
	String(const char *szStr);
	String(const string &refStr);
	String(const String &refStr);
	String &operator=(const String &refStr);
	String operator+(const String &refStr);
	char operator[](int index);
	String &operator+=(const String &refStr);
	~String();

private:
	char *m_pszStr;
	int m_iLen;
};

// 左移運算符重載
ostream &operator<<(ostream &os, const String &str) {
	os << str.m_pszStr;

	return(os);
}

// 右移運算符重載
istream &operator>>(istream &is, String &str) {
	if (str.m_pszStr)
		delete[] str.m_pszStr;
	char szTmp[4096] = { 0 };
	is >> szTmp;
	str.m_iLen = strlen(szTmp);
	str.m_pszStr = new char[str.m_iLen + 1];
	strcpy(str.m_pszStr, szTmp);

	return(is);
}


// 默認構造函數
String::String() : m_pszStr(NULL), m_iLen(0)
{

}

// 含參構造函數
String::String(const char *szStr)
{
	// 確保szStr裏面有內容
	if (NULL != szStr) {
		m_iLen = strlen(szStr);
		m_pszStr = new char[m_iLen + 1];
		strcpy(m_pszStr, szStr);
	}
}

// 含參構造函數
String::String(const string &refStr)
{
	if (refStr.length()) {
		m_iLen = refStr.length();
		m_pszStr = new char[m_iLen + 1];
		strcpy(m_pszStr, refStr.c_str());
	}
}

// 拷貝構造函數
String::String(const String &refStr)
{
	this->m_iLen = refStr.m_iLen;
	this->m_pszStr = new char[m_iLen + 1];
	strcpy(m_pszStr, refStr.m_pszStr);
}

// 賦值操作符重載
String & String::operator=(const String &refStr)
{
	if (this->m_pszStr) {
		delete[] this->m_pszStr;
		this->m_pszStr = NULL;
	}
	this->m_iLen = refStr.m_iLen;
	this->m_pszStr = new char[this->m_iLen + 1];
	strcpy(this->m_pszStr, refStr.m_pszStr);

	return(*this);
}

// +操作符重載
String String::operator+(const String &refStr)
{
	String tmp;

	int iLenTotal = this->m_iLen + refStr.m_iLen;
	tmp.m_iLen = iLenTotal;
	tmp.m_pszStr = new char[iLenTotal + 1];
	strcpy(tmp.m_pszStr, this->m_pszStr);
	strcat(tmp.m_pszStr, refStr.m_pszStr);

	return(tmp);
}

// []操作符重載
char String::operator[](int index)
{
	return(this->m_pszStr[index]);
}

// +=運算符重載
String & String::operator+=(const String &refStr)
{
	int iLenTotal = this->m_iLen + refStr.m_iLen;
	if (m_iLen > 0 && m_pszStr) {
		char *pTmp = new char[this->m_iLen + 1];
		strcpy(pTmp, this->m_pszStr);
		this->m_iLen = iLenTotal;
		delete[] m_pszStr;
		m_pszStr = new char[m_iLen + 1];
		strcpy(m_pszStr, pTmp);
		strcat(m_pszStr, refStr.m_pszStr);
	}
	else {
		*this = refStr;
	}

	return(*this);
}

// 析構函數
String::~String()
{
	if (m_pszStr) {
		delete[] m_pszStr;
		m_pszStr = NULL;
		m_iLen = 0;
	}
}

int main() {
	// 無參構造測試
	String str1;
	// 含參構造測試
	String str2("Hello, world");
	string str(", Jack");
	String str3(str);
	// 拷貝構造測試
	String str4(str2);
	// []運算符測試
	cout << str4[0] << endl;
	// +=運算符測試
	str2 += str3;
	cout << str2 << endl;
	// =運算符測試
	str4 = str1 = str2;
	cout << str4 << endl;
	cout << str1 << endl;
	// +運算符測試
	str4 = str1 + " " + str2;
	cout << str4;

	system("pause");

	return(0);
}

(完)

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