📄 string01.hpp
字号:
0: // Listing 16.1 The String Class
1:
2: #include <iostream>
3: #include <string.h>
4: using namespace std;
5:
6: class String
7: {
8: public:
9: // constructors
10: String();
11: String(const char *const);
12: String(const String &);
13: ~String();
14:
15: // overloaded operators
16: char & operator[](int offset);
17: char operator[](int offset) const;
18: String operator+(const String&);
19: void operator+=(const String&);
20: String & operator= (const String &);
21:
22: // General accessors
23: int GetLen()const { return itsLen; }
24: const char * GetString() const { return itsString; }
25: // static int ConstructorCount;
26:
27: private:
28: String (int); // private constructor
29: char * itsString;
30: unsigned short itsLen;
31:
32: };
33:
34: // default constructor creates string of 0 bytes
35: String::String()
36: {
37: itsString = new char[1];
38: itsString[0] = '\0';
39: itsLen=0;
40: // cout << "\tDefault string constructor\n";
41: // ConstructorCount++;
42: }
43:
44: // private (helper) constructor, used only by
45: // class methods for creating a new string of
46: // required size. Null filled.
47: String::String(int len)
48: {
49: itsString = new char[len+1];
50: for (int i = 0; i<=len; i++)
51: itsString[i] = '\0';
52: itsLen=len;
53: // cout << "\tString(int) constructor\n";
54: // ConstructorCount++;
55: }
56:
57: // Converts a character array to a String
58: String::String(const char * const cString)
59: {
60: itsLen = strlen(cString);
61: itsString = new char[itsLen+1];
62: for (int i = 0; i<itsLen; i++)
63: itsString[i] = cString[i];
64: itsString[itsLen]='\0';
65: // cout << "\tString(char*) constructor\n";
66: // ConstructorCount++;
67: }
68:
69: // copy constructor
70: String::String (const String & rhs)
71: {
72: itsLen=rhs.GetLen();
73: itsString = new char[itsLen+1];
74: for (int i = 0; i<itsLen;i++)
75: itsString[i] = rhs[i];
76: itsString[itsLen] = '\0';
77: // cout << "\tString(String&) constructor\n";
78: // ConstructorCount++;
79: }
80:
81: // destructor, frees allocated memory
82: String::~String ()
83: {
84: delete [] itsString;
85: itsLen = 0;
86: // cout << "\tString destructor\n";
87: }
88:
89: // operator equals, frees existing memory
90: // then copies string and size
91: String& String::operator=(const String & rhs)
92: {
93: if (this == &rhs)
94: return *this;
95: delete [] itsString;
96: itsLen=rhs.GetLen();
97: itsString = new char[itsLen+1];
98: for (int i = 0; i<itsLen;i++)
9: itsString[i] = rhs[i];
00: itsString[itsLen] = '\0';
01: return *this;
02: // cout << "\tString operator=\n";
03: }
04:
05: //non constant offset operator, returns
06: // reference to character so it can be
07: // changed!
08: char & String::operator[](int offset)
09: {
10: if (offset > itsLen)
11: return itsString[itsLen-1];
12: else
13: return itsString[offset];
14: }
15:
16: // constant offset operator for use
17: // on const objects (see copy constructor!)
18: char String::operator[](int offset) const
19: {
20: if (offset > itsLen)
21: return itsString[itsLen-1];
22: else
23: return itsString[offset];
: }
25:
26: // creates a new string by adding current
27: // string to rhs
28: String String::operator+(const String& rhs)
29: {
30: int totalLen = itsLen + rhs.GetLen();
31: String temp(totalLen);
32: int i, j;
33: for (i = 0; i<itsLen; i++)
34: temp[i] = itsString[i];
35: for (j = 0; j<rhs.GetLen(); j++, i++)
36: temp[i] = rhs[j];
37: temp[totalLen]='\0';
38: return temp;
39: }
40:
41: // changes current string, returns nothing
42: void String::operator+=(const String& rhs)
43: {
44: unsigned short rhsLen = rhs.GetLen();
45: unsigned short totalLen = itsLen + rhsLen;
46: String temp(totalLen);
47: int i, j;
48: for (i = 0; i<itsLen; i++)
49: temp[i] = itsString[i];
50: for (j = 0; j<rhs.GetLen(); j++, i++)
51: temp[i] = rhs[i-itsLen];
52: temp[totalLen]='\0';
53: *this = temp;
54: }
55:
56: // int String::ConstructorCount = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -