Читаем Освой самостоятельно С++ за 21 день. полностью

60:    for (int i = 0; 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

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

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 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: {

12S:    int totalLen = itsLen + rhs.GetLen;

129:    String temp(totalLen);

130:    int i, j;

131:    for (i = 0; i

132:       temp[i] = itsString[i];

133:    for (j = 0; j

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.GetLen;

143:    unsigned short totalLen = itsLen + rhsLen;

144:    String temp(totalLen);

145:    int i, j;

146:    for (i = 0; i

147:       temp[i] = itsString[i];

148:    for (j = 0, i = 0; j

149:    temp[i] = rhs[i-itsLen];

150:    temp[totalLen]='\0' ;

151:    *this = temp;

152: }

153:

154: // int String::ConstructorCount =

155: ostream& operator<< ( ostream& theStream,String& theString)

156: {

157:    theStream << theString.itsString; 158: return theStream;

159: }

160:

161: int main

162: {

163:    String theString("Hello world.");

164:    cout << theString;

165:    return 0;

166: }


Результат:

Hello world.


Анализ: В строке 19 operator<< объявляется как функция-друг, которая принимает ссылки на ostream и String и возвращает ссылку на ostream. Обратите внимание, что она не является функцией-членом класса String. Поскольку эта функция возвращает ссылку на ostream, можно конкатенировать вызовы operator<< следующим образом:

cout << "myAge: " << itsAge << " years. ";

Выполнение этой функции-друга представлено строками 155—159. Основное назначение функции состоит в том, чтобы скрыть детали процедуры передачи строки в iostream. Больше ничего и не требуется. Более подробно о функции ввода и перегрузке operator>> вы узнаете на следующем занятии.

Перейти на страницу:

Похожие книги

Сущность технологии СОМ. Библиотека программиста
Сущность технологии СОМ. Библиотека программиста

В этой книге СОМ исследуется с точки зрения разработчика C++. Написанная ведущим специалистом по модели компонентных объектов СОМ, она раскрывает сущность СОМ, помогая разработчикам правильно понять не только методы модели программирования СОМ, но и ее основу. Понимание мотивов создания СОМ и ее аспектов, касающихся распределенных систем, чрезвычайно важно для тех разработчиков, которые желают пойти дальше простейших приложений СОМ и стать по-настоящему эффективными СОМ-программистами. Показывая, почему СОМ для распределенных систем (Distributed СОМ) работает именно так, а не иначе, Дон Бокс дает вам возможность применять эту модель творчески и эффективно для ежедневных задач программирования.

Дональд Бокс

Программирование, программы, базы данных / Программирование / Книги по IT