|
Программирование >> Дополнительные возможности наследования
метода класса. В качестве исключения следует помнить, что метод InvariantsO не возвращает TRUE до вызова конструктора и после выполнения деструктора. Использование метода InvariantsO для обычного класса показано в листинге 21.5. Листинг 21.S. ИСНОЛЬЗОВаннс метода InvariantsO 2 3 4 5 7 8 9 10 12 13 14 15 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 #define DEBUG #define SHOW INVARIANTS ftinclude <iostream.h> #include <string.h> #ifndef DEBUG #define ASSERT(x) #else #define ASSERT(x) \ if (! (X)) \ { \ cout ERROR!! Assert << #x failed\ n; \ cout on line LINE X n; \ cout in file FILE V n; \ #endif const int FALSE = 0; const int TRUE = 1; typedef int bool; 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 &); int GetLenOconst { return itsLen; } const char * GetStringO const { return itsString; } bool InvariantsO const; private: String (int); закрытый конструктор char * itsString; беззнаковая целочисленная переменная itsLen; 46; } ; 48; стандартный конструктор создает строку нулевой длины 49; String; ;String() 50; { 51; itsString = new char[1]; 52; itsString[0] = \ 0 ; 53: itsLen=0; 54: ASSERT(Invariants()); 55: } 57: закрытый (вспомогательный) конструктор, используется 58; методами класса только для создания новой строки 59: требуемого размера, При этом вставляется концевой нулевой символ. 60: String:;String(int len) 61; { 62; itsString = new char[len+l]; 63; for (int 1 = 0; i<=len; i++) 64; itsString[i] = \ 0; 65; itsLen=len; 66; ASSERTdnvariantsO); 67; } 69; Преобразует массив символов к типу String 70; String;;String(const char const cString) 71; { 72; itsLen = strlen(cString); 73; itsString = new char[itsLen+1]; 74; for (int 1 = 0; KitsLen; i++) 75; itsString[i] = cString[i]; 76: itsString[itsLen]=\ 0 ; 77; ASSERTdnvariantsO); 78; } 80: конструктор-копировщик 81: String: :String (const String & rhs) 82: { 83: itsLen=rhs.GetLen(); 84; itsString = new char[itsLen+1]; 85; for (int i = 0; KitsLen;i++) 86; itsString[i] = rhs[i] 87; itsString[itsLen] = \ 0 88; ASSERT(Invariants()); 89: } 90: 91; деструктор, освобождает выделенную память 92; String:: String () 93; { 94; ASSERT(Invariants()); delete [] ItsString; itsLen = 0; оператор выполняет сравнение, освобождает занятую память, а затем копирует строку и ее размер Strings String::operator=(const String & rhs) { ASSERT(Invariants()); If (this == &rhs) return ♦this; delete [] itsString; itsLen=rhs,GetLen(); itsString = new char[itsLen+1]; for (int i = 0; KitsLen; i++) itsStringOi] = rhsCi]; itsString[itsLen] = \ 0; ASSERTdnvariantsO); return this; неконстантный оператор индексирования char & String;:operator[](int offset) ASSERT(Invariants()); if (offset > itsLen) { ASSERT(Invariants()); return itsString[itsLen-1 ]; else ASSERT(Invariants()); return itsString[offset]; константный оператор индексирования char String::operator[](int offset) const { ASSERT(Invariants()); char retVal; if (offset > itsLen) retVal = itsString[itsLen-1]; else retVal = itsString[offset]; ASSERTdnvariantsO); return retVal; bool String::lnvariants() const {
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |