数组(三)
字符串类
#include <iostream>
using namespace std;
class String
{
public:
// constructors
String();
String(const char* const);
String(const String&);
~String();
// overloaded operators
char& operator [](unsigned short offset);
char operator [](unsigned short offset) const;
String operator +(const String&);
void operator += (const String&);
String& operator = (const String&);
// general accessors
unsigned short GetLen() const { return itsLen; }
const char* GetString() const { return itsString; }
private:
String(unsigned short); // private constructor
char* itsString;
unsigned short itsLen;
};
////////////////////////////////////////////////////////////////////
// 构造函数
String::String() {
itsString = new char[1];
itsString[0] = '\0';
itsLen = 0;
}
String::String(unsigned short len) {
itsString = new char[len + 1];
for (unsigned short i = 0; i <= len; i++)
itsString[i] = '\0';
itsLen = len;
}
String::String(const char* const cString) {
itsLen = strlen(cString);
itsString = new char[itsLen + 1];
for (unsigned short i = 0; i < itsLen; i++)
itsString[i] = cString[i];
itsString[itsLen] = '\0';
}
String::String(const String& rhs) {
itsLen = rhs.GetLen();
itsString = new char[itsLen + 1];
for (unsigned short i = 0; i < itsLen; i++)
itsString[i] = rhs[i]; // 这里的访问操作符在后面要实现之。
itsString[itsLen] = '\0';
}
String::~String() {
delete [] itsString;
itsLen = 0;
}
///////////////////////////////////////////////////////////////////////
// 以下实现自定义的操作符重载
String& String::operator = (const String& rhs) {
// 重要的判断!
if (this == &rhs)
return *this;
delete [] itsString;
itsLen = rhs.GetLen();
itsString = new char[itsLen + 1];
for (unsigned short i = 0; i < itsLen; i++)
itsString[i] = rhs[i];
itsString[itsLen] = '\0';
return *this;
}
char& String::operator [](unsigned short offset) {
if (offset > itsLen)
return itsString[itsLen - 1];
else
return itsString[offset];
}
char String::operator [](unsigned short offset) const {
if (offset > itsLen)
return itsString[itsLen - 1];
else
return itsString[offset];
}
String String::operator +(const String& rhs) {
unsigned short totalLen = itsLen + rhs.GetLen();
String temp = String(totalLen);
unsigned short i, j;
for (i = 0; i < itsLen; i++)
temp[i] = itsString[i];
for (j = 0; j < rhs.GetLen(); i++, j++)
temp[i] = rhs[j];
temp[totalLen] = '\0';
return temp;
}
void String::operator += (const String& rhs) {
unsigned short rhsLen = rhs.GetLen();
unsigned short totalLen = itsLen + rhsLen;
String temp(totalLen);
unsigned short i, j;
for (i = 0; i < itsLen; i++)
temp[i] = itsString[i];
for (j = 0; j < rhsLen; i++, j++)
temp[i] = rhs[j];
temp[totalLen] = '\0';
*this = temp;
}
int main(int argc, char *argv[])
{
String s1("initial test");
cout << "s1: \t" << s1.GetString() << endl;
char* temp = "Hello World";
s1 = temp;
cout << "s1: \t" << s1.GetString() << endl;
char tempTwo[20];
strcpy(tempTwo, "; nice to be here!");
s1 += tempTwo;
cout << "tempTwo: \t" << tempTwo << endl;
cout << "s1: \t" << s1.GetString() << endl;
cout << "s1[4]: \t" << s1[4] << endl;
s1[4] = 'x';
cout << "s1: \t" << s1.GetString() << endl;
cout << "s1[999]: \t" << s1[999] << endl;
String s2("Another string");
String s3;
s3 = s1 + s2;
cout << "s3: \t" << s3.GetString() << endl;
String s4;
s4 = "Why does this work?";
cout << "s4: \t" << s4.GetString() << endl;
return 0;
}
using namespace std;
class String
{
public:
// constructors
String();
String(const char* const);
String(const String&);
~String();
// overloaded operators
char& operator [](unsigned short offset);
char operator [](unsigned short offset) const;
String operator +(const String&);
void operator += (const String&);
String& operator = (const String&);
// general accessors
unsigned short GetLen() const { return itsLen; }
const char* GetString() const { return itsString; }
private:
String(unsigned short); // private constructor
char* itsString;
unsigned short itsLen;
};
////////////////////////////////////////////////////////////////////
// 构造函数
String::String() {
itsString = new char[1];
itsString[0] = '\0';
itsLen = 0;
}
String::String(unsigned short len) {
itsString = new char[len + 1];
for (unsigned short i = 0; i <= len; i++)
itsString[i] = '\0';
itsLen = len;
}
String::String(const char* const cString) {
itsLen = strlen(cString);
itsString = new char[itsLen + 1];
for (unsigned short i = 0; i < itsLen; i++)
itsString[i] = cString[i];
itsString[itsLen] = '\0';
}
String::String(const String& rhs) {
itsLen = rhs.GetLen();
itsString = new char[itsLen + 1];
for (unsigned short i = 0; i < itsLen; i++)
itsString[i] = rhs[i]; // 这里的访问操作符在后面要实现之。
itsString[itsLen] = '\0';
}
String::~String() {
delete [] itsString;
itsLen = 0;
}
///////////////////////////////////////////////////////////////////////
// 以下实现自定义的操作符重载
String& String::operator = (const String& rhs) {
// 重要的判断!
if (this == &rhs)
return *this;
delete [] itsString;
itsLen = rhs.GetLen();
itsString = new char[itsLen + 1];
for (unsigned short i = 0; i < itsLen; i++)
itsString[i] = rhs[i];
itsString[itsLen] = '\0';
return *this;
}
char& String::operator [](unsigned short offset) {
if (offset > itsLen)
return itsString[itsLen - 1];
else
return itsString[offset];
}
char String::operator [](unsigned short offset) const {
if (offset > itsLen)
return itsString[itsLen - 1];
else
return itsString[offset];
}
String String::operator +(const String& rhs) {
unsigned short totalLen = itsLen + rhs.GetLen();
String temp = String(totalLen);
unsigned short i, j;
for (i = 0; i < itsLen; i++)
temp[i] = itsString[i];
for (j = 0; j < rhs.GetLen(); i++, j++)
temp[i] = rhs[j];
temp[totalLen] = '\0';
return temp;
}
void String::operator += (const String& rhs) {
unsigned short rhsLen = rhs.GetLen();
unsigned short totalLen = itsLen + rhsLen;
String temp(totalLen);
unsigned short i, j;
for (i = 0; i < itsLen; i++)
temp[i] = itsString[i];
for (j = 0; j < rhsLen; i++, j++)
temp[i] = rhs[j];
temp[totalLen] = '\0';
*this = temp;
}
int main(int argc, char *argv[])
{
String s1("initial test");
cout << "s1: \t" << s1.GetString() << endl;
char* temp = "Hello World";
s1 = temp;
cout << "s1: \t" << s1.GetString() << endl;
char tempTwo[20];
strcpy(tempTwo, "; nice to be here!");
s1 += tempTwo;
cout << "tempTwo: \t" << tempTwo << endl;
cout << "s1: \t" << s1.GetString() << endl;
cout << "s1[4]: \t" << s1[4] << endl;
s1[4] = 'x';
cout << "s1: \t" << s1.GetString() << endl;
cout << "s1[999]: \t" << s1[999] << endl;
String s2("Another string");
String s3;
s3 = s1 + s2;
cout << "s3: \t" << s3.GetString() << endl;
String s4;
s4 = "Why does this work?";
cout << "s4: \t" << s4.GetString() << endl;
return 0;
}