|
Программирование >> Дополнительные возможности наследования
Листинг IS.B. Перегрузка operator<<() 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 #include <iostream.h> #include <string.h> class String { public: конструкторы StringO; String(const char .const); String(const String &); StringO; перегруженные операторы char & operator[](int offset); char operator[](int offset) const; String operator+(const String&); void operator+=(const Stringi); String & operator= (const String &); friend ostream& operator<< ( ostream& theStream,String& theString); Общие методы доступа int 6etLen()const { return itsLen; } const char * GetStringO const { return itsString; } private: String (int); закрытый конструктор char * itsString; unsigned short itsLen; конструктор, заданный no умолчанию, создает строку длиной О байт String::String() itsString = new char[1]; itsString[0] = \ 0 ; itsLen=0; cout \ tDefault string constructor\ n ; ConstructorCount++; закрытый конструктор, используемый только методами класса для создания новой строки указанного размера, заполненной значениями NULL, String;:String(int len) itsString = new char[l-.; Ч]; for (int 1=0; i<=len, i++) 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 itsString[i] = \ О; itsLen=len; cout \ tString(int) constructor\ n ; ConstructorCount++; Преобразует массив символов в строку String::String(const char const cString) { itsLen = strlen(cString); itsString = new char[itsLen+1]; for (int i = 0; i<itsLen; i++) itsString[i] = cString[i]; itsString[itsLen]=\ 0 ; cout \ tString(char*) constructor\ n ; ConstructorCount++; конструктор-копировщик string::String (const String & rhs) itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (int i = 0; i<itsLen:i++) itsString[i] = rhs[i]; itsString[itsLen] = \ 0; cout \ tString(String&) constructor\ n ; ConstructorCount++; деструктор освобождает занятую память String:: String () delete [] itsString; itsLen = 0; cout \ tString destructor\ n ; оператор равенства освобождает память, а затем копирует строку и размер String& String::operator=(const String & rhs) if (this == &rhs) return .this; delete [] itsString; itsLen=rhs.GetLen(); itsString = new char[itsLen+1]; for (int 1 = 0; KitsLen; i++) itsString[i] = rhs[i]; itsString[itsLen] = \ 0; 99: return this; 100: cout X tString operator=\ n ; 101: } 102: 103: неконстантный оператор индексирования, 104: возвращает ссылку на символ, который можно 105: изменить! 106: char & String::operator[](int offset) 107: { 108: if (offset > itsLen) 109: return itsString[itsLen-1]; 110: else 111; return itsString[offset]; 112: } 113: 114: константный оператор индексирования, 115: используется для константных объектов (см. конструктор-копировщик!) 116: char String::operator[](int offset) const 117: { 118: if (offset > itsLen) 119: return itsString[itsLen-1]; 120: else 121: return itsString[offset]; 122: } 123: 124: создает новую строку, добавляя текущую 125: строку к rhs 126: String String::operator+(const String& rhs) 127: { 128: int totalLen = itsLen + rhs.GetLen(); 129: String temp(totalLen); 130: int 1, j; 131: for (i = 0; KitsLen; i++) 132: temp[i] = itsString[i]; 133: for (j = 0; j<rhs.6etLen(); i++) 134: temp[i] = rhs[]]; 135: temp[totalLen]=\ 0 ; 136: return temp; 137: } 138: 139: изменяет текущую строку, ничего не возвращая 140: void String::operator+=(const String& rhs) 141: { 142: unsigned short rhsLen = rhs.6etLen(); 143: unsigned short totalLen = itsLen + rhsLen; 144: String temp(totalLen); 145: int i, j; 146: for (1 = 0; KitsLen; i++) 147: temp[i] = itsString[i]; 148: for (j = 0, 1=0; j<rhs.6etLen(); i++)
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |