Π§ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠ½ΠΈΠ³ΠΈ ΠΎΠ½Π»Π°ΠΉΠ½ Π½Π° Bookidrom.ru! БСсплатныС ΠΊΠ½ΠΈΠ³ΠΈ Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΊΠ»ΠΈΠΊΠ΅

Π§ΠΈΡ‚Π°Ρ‚ΡŒ ΠΎΠ½Π»Π°ΠΉΠ½ «Освой ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Π‘++ Π·Π° 21 дСнь.Β». Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° 98

Автор ДТСсс Π›ΠΈΠ±Π΅Ρ€Ρ‚ΠΈ

Π§Ρ‚ΠΎ дальшС

ПослСдняя нСдСля начинаСтся с изучСния Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… возмоТностСй наслСдования. Π—Π°Ρ‚Π΅ΠΌ Π½Π° занятии 16 Π²Ρ‹ ΠΈΠ·ΡƒΡ‡ΠΈΡ‚Π΅ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, Π° Π½Π° занятии 17 ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ с ΠΎΠ΄Π½ΠΈΠΌ Π·Π°ΠΌΠ΅Ρ‡Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ стандартов C++ β€” пространствами ΠΈΠΌΠ΅Π½. ЗанятиС 18 посвящСно Π°Π½Π°Π»ΠΈΠ·Ρƒ основ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. Π’ этот дСнь Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ сконцСнтрировано Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° синтаксисС языка, сколько Π½Π° ΠΈΠ·ΡƒΡ‡Π΅Π½ΠΈΠΈ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования. На занятии 19 Π²Ρ‹ ΠΏΠΎΠ·Π½Π°ΠΊΠΎΠΌΠΈΡ‚Π΅ΡΡŒ с использованиСм шаблонов, Π° Π½Π° занятии 20 ΡƒΠ·Π½Π°Π΅Ρ‚Π΅ ΠΎ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°Ρ… отслСТивания ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ситуаций ΠΈ ошибок. НаконСц, Π½Π° послСднСм занятии Π±ΡƒΠ΄ΡƒΡ‚ раскрыты Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ хитрости ΠΈ сСкрСты программирования Π½Π° C++, Ρ‡Ρ‚ΠΎ сдСлаСт вас настоящим Π³ΡƒΡ€Ρƒ Π² этой области.

Π”Π΅Π½ΡŒ 15-ΠΉ. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ возмоТности наслСдования

Π”ΠΎ настоящСго ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π²Ρ‹ использовали ΠΎΠ΄ΠΈΠ½ΠΎΡ‡Π½ΠΎΠ΅ ΠΈ мноТСствСнноС наслСдованиС для создания ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ простых связСй ΠΌΠ΅ΠΆΠ΄Ρƒ классами. БСгодня Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅:

β€’ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π²Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

β€’ Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ Π΄Π΅Π»Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΊΠ°ΠΊ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ

β€’ ΠšΠ°ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ класс Π²Π½ΡƒΡ‚Ρ€ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ³ΠΎ

β€’ ΠšΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΎΠ΅ наслСдованиС

Π’Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅

Анализируя ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹, ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ Π½Π° ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΡ… занятиях, Π²Ρ‹, вСроятно, Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Π² классах допускаСтся использованиС Π² ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½Π°Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π΄Ρ€ΡƒΠ³ΠΈΡ… классов. Π’ этом случаС программисты Π½Π° C++ говорят, Ρ‡Ρ‚ΠΎ внСшний класс содСрТит Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ. Π’Π°ΠΊ, класс Employee Π² качСствС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ² ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ строковыС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ (с ΠΈΠΌΠ΅Π½Π΅ΠΌ сотрудника) ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ с цСлочислСнными значСниями (Π·Π°Ρ€ΠΏΠ»Π°Ρ‚ΠΎΠΉ ΠΈ Ρ‚.Π΄.).

Π’ листингС 15.1 прСдставлСн Π½Π΅Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½Π½Ρ‹ΠΉ, Π½ΠΎ вСсьма ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΉ класс String. Запуск Ρ‚Π°ΠΊΠΎΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Π½Π΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π²Ρ‹Π²ΠΎΠ΄Ρƒ ΠΊΠ°ΠΊΠΈΡ…-Π»ΠΈΠ±ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ², Π½ΠΎ ΠΎΠ½Π° потрСбуСтся ΠΏΡ€ΠΈ написании Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ этого занятия.

Листинг 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.

Листинг 15.2. Класс Employee

1: #include "String.hpp"

2:

3: class Employee

4: {

5:

6:    public:

7:       Employee();

8:       Employee(char *, char *, char >>, long);

9:       ~Employee();

10:      Employee(const Employee&);

11:      Employee & operator= (const Employee &);

12:

13:      const String & GetFirstName() const

14:         { return itsFirstName; }

15:      const String & GetLastName() const { return itsLastName; }

16:      const String & GetAddress() const { return itsAddress; }

17:      long GetSalary() const { return itsSalary; } 18;

19:      void SetFirstName(const String & fNama)

20:         { itsFirstName = fName; }

21:      void SetLastName(const String & lNama)

22:         { itsLastName = lNamo; }

23:      void SetAddress(const String & address)

24:         { itsAddress = address; }

25:      void SetSalary(long salary) { itsSalary = salary; }

26:   private:

27:      String itsFirstName;

28:      String itsLastName;

29:      String itsAddress;

30:      long itsSalary;

31: };

32:

33: Employee::Employee();

34:    itsFirstName(""),

35:    itsLastName(""),

36:    itsAddress(""),

37:    itsSalary(0)

38: { }

39:

40: Employee::Employee(char * firstName, char * lastName,

41:    char * address, long salary):

42:    itsFirstName(firstName),

43:    itsLastName(lastName),

44:    itsAddress(address),

45:    itsSalary(salary)

46: { }

47:

48: Employee::Employee(const Employee & rhs):

49:    itsFirstName(rhs.GetFirstName()),

50:    itsLastName(rhs,GetLastName()),

51:    itsAddress(rhs,GetAddress()),

52:    itsSalary(rhs.GetSalary())

53: { }

54:

55: Employee::~Employea() { }

56:

57: Employee & Employae::Qperator= (const Employee & rhs)

58: {

59:    if (thls β€” &rhs)

60:       return *this;

61:

62:    itsFlrstName = rhs.GetFlrstName();

63:    itsLastName = rhs,GetLastName();

64:    itsAddress = rhs,GetAddress();

65:    itsSalary = rhs,GetSalary();

66:

67:    return *thls;

68: }

69:

70: int main()

71: {

72:    Employee Edie("Jane","Doe","1461 Shore Parkway", 20000);

73:    Edie.SetSalary(50000);

74:    String LastName("Levine");

75:    Edie.SetLastName(LastName);

76:    Edie.SetFirstName("Edythe");

77:

78:    cout << "Имя: ";