Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Листинг 15.1. Класс string
1: #include < iostream.h> 2: #include < string.h> 3: 4: class String 5: { 6: public: 7: // конструкторы 8: String(); 9: String(const char *const); 10: String(const String &) 11: ~String(); 12: 13: // перегруженные операторы 14: char & operator[](int offset); 15: char operator[](int offset) const; 16: String operator+(const String&); 17: void operator+=(const String&); 18: String & operator= (const String &); 19: 20: // Общие методы доступа 21: int GetLen()const { return itsLen; } 22: const char * GetString() const { return itsString; } 23: // статический целочисленный счетчик ConstructorCount; 24: 25: private: 26: String (int); // закрытый конструктор 27: char * itsString; 28: unsigned short itsLen; 29: 30: }; 31: 32: // конструктор класса String пo умолчанию создает строку длиной 0 байт 33: String:: String() 34: { 35: itsString = new char[1]; 36: itsString[0] = '\0'; 37: itsLen=0; 38: // cout < < " \tDefault string constructor\n"; 39: // ConstructorCount++; 40: } 41: 42: // закрытый конструктор, используемый только 43: // методами клаcса для создания новой cтроки 44: // указанного размера, заполненной нулями 45: String:: String(int len) 46: { 47: itsString = new ohar[len+1]; 48: for (int i = 0; i< =len; i++) 49: itsString[i] = '\0'; 50: itsLen=len; 51: // cout < < " \tString(int) constructor\n"; 52: // ConstructorCount++; 53: } 54: 55: // Преобразует массив символов в cтроку 56: String:: String(const char * oonst cString) 57: { 58: itsLen = strlen(cString); 59: itsString = new char[itsLen+1]; 60: for (int i = 0; i< itsLen; i++) 61: itsString[i] = cString[i]; 62: itsString[itsLen]='\0'; 63: // cout < < " \tString(char*) constructor\n"; 64: // ConstructorCount++; 65: } 66: 67: // конструктор-копировщик 68: String:: String (const String & rhs) 69: { 70: itsLen=rhs.GetLen(); 71: itsString = new char[itsLen+1]; 72: for (int i = 0; i< itsLen; i++) 73: itsString[i] = rhs[i]; 74: itsString[itsLen] = '\0'; 75: // cout < < " \tString(String&) constructor\n 76: // ConstructorCount++; 77: } 78: 79: // деструктор освобождает занятую память 80: String:: ~String () 81: { 82: delete [] itsString; 83: itsLen = 0; 84: // cout < < " \tString destructor\n"; 85: } 86: 87: // этот оператор освобождает память, а затем 88: // копирует строку и размер 89: String& String:: operator=(const String & rhs) 90: { 91: if (this == & rhs) 92: return *this; 93: delete [] itsString; 94: itsLen=rhs.GetLen(); 95: itsString = new char[itsLen+1]; 96: for (int i = 0; i< itsLen; i++) 97: itsString[i] = rhs[i]; 98: itsString[itsLen] = '\0'; 99: return *this; 100: // cout < < " \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 itsStnng[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 i, j; 131: for (i = 0; i< itsLen; i++) 132: temp[i] = itsString[i]; 133: for (j = 0: j< rhs.GetLen(); j++, i++) 134: temp[i] = rhs[j]; 135: temp[totalLen]='\0'; 136: return temp; 137: } 138: 139: // изменяет текущую строку, ничего не возвращая 140: void String:: operator+=(const String& rhs) 141: { 142: unsigned short rhsLen = rhs.GetLen(); 143: unsigned short totalLen = itsLen + rhsLen; 144: String temp(totalLen); 145: int i, j; 146: for (i = 0; i< itsLen; i++) 147: temp[i] = itsString[i]; 148: for (j = 0; j< rhs.GetLen(); j++, i++) 149: temp[i] = rhs[i-itsLen]; 150: temp[totalLen]='\0'; 151: *this = temp; 152: } 153: 154: // int String:: ConstructorCount = 0;
Результат: Нет
Анализ: Представленный в листинге 15.1 класс String напоминает другой класс, использованный в листинге 12.12. Однако есть одно важное отличие между этими двумя классами: конструкторы и некоторые функции листинга 12.12 включали операторы вывода на печать, благодаря которым на экране отображались сообщения об их использовании. В листинге 15.1 эти операторы временно заблокированы, но они будут использоваться в следующих примерах. Статическая переменная-член ConstructorCount объявляется и инициализируется соответственно в строках 23 и 154. Значение этой переменной увеличивается на единицу при вызове любого конструктора класса String. Эти функции также заблокированы и будут использоваться в следующих листингах. В листинге 15.2 объявляется класс Employee, содержащий три объекта класса String.
|