#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);
}
(完)