Программирование >>  Дополнительные возможности наследования 

1 ... 220 221 222 [ 223 ] 224 225 226 ... 265


метода класса. В качестве исключения следует помнить, что метод 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 {



1 ... 220 221 222 [ 223 ] 224 225 226 ... 265

© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика