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

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

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

ИспользованиС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹ класса, ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ функциям, ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ значСния, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΡ€ΠΈ объявлСнии Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ-Ρ‡Π»Π΅Π½ΠΎΠ² с Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΡƒΠΆΠ΅ Π·Π½Π°ΠΊΠΎΠΌΡ‹ΠΉ Π²Π°ΠΌ синтаксис, ΠΊΠ°ΠΊ ΠΏΠΎΠΊΠ°Π·Π°Π½ΠΎ Π² листингС 10.2

Листинг 10.2. ИспользованиС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

1: //Листинг 10.2. ИспользованиС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

2: #include <iostream.h>

3:

4: int

5:

6: // ОбъявлСниС класса Rectangle

7: class Rectangle

8: {

9:    public:

10:      // конструкторы

11:      Rectangle(int width, int height);

12:      ~Rectangle() { }

13:      void DrawShape(int aWidth, int aHeight, bool UseCurrentVals = false) const;

14:

15:   private:

16:      int itsWidth;

17:      int itsHeight;

18: };

19:

20: //ΠŸΡ€ΠΈΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ конструктора

21: Rectangle::Rectangle(int width, int height):

22: itsWidth(width), // инициализация

23: itsHeight(height)

24: { } // пустоС Ρ‚Π΅Π»ΠΎ

25:

26:

27: // для Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅Π³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

28: void Rectangle::DrawShape(

29:    int width,

30:    int height,

31:    bool UseCurrentValue

32:    ) const

33: {

34:    int printWidth;

35:    int printHeight;

36:

37:    if (UseCurrentValue == true)

38:    {

39:       printWidth = itsWidth;  // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ класса

40:       printHeight = itsHeight;

41:    }

42:    else

43:    {

44:       printWidth = width;   // ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°

45:       printHeight = height;

46:    }

47:

48:

49:    for (int i = 0; i<printHeight; i++)

50:    {

51:       for (int j = 0; j< printWidth; j++)

52:       {

53:          cout << "*";

54:       }

55:       cout << "\n";

56:    }

57: }

58:

59: // ВыполняСмая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ использованиС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

60: int main()

61: {

62:    // созданиС ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ° 30 Π½Π° 5

63:    Rectangle theRect(30,5);

64:    cout << "DrawShape(0,0,true)...\n";

65:    theRect.DrawShape(0,0,true);

66:    cout << "DrawShape(40,2)...\n";

67:    theRect.DrawShape(40,2);

68:    return 0;

69: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

DrawShape(0,0,true)...

******************************

******************************

******************************

******************************

******************************

DrawShape(40,2)...

****************************************

****************************************


Анализ: Π’ листингС 10.2 пСрСгруТСнная функция DrawShape() Π·Π°ΠΌΠ΅Π½Π΅Π½Π° простой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ, Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹ΠΌΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Ѐункция ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π° Π² строкС 13 с трСмя ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ. ΠŸΠ΅Ρ€Π²Ρ‹Π΅ Π΄Π²Π°, aWidth ΠΈ aHeigth, относятся ΠΊ Ρ‚ΠΈΠΏΡƒ USH0RT, Π° Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ прСдставляСт собой Π»ΠΎΠ³ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ UseCurrentVals, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false.

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ этой Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π³Ρ€ΠΎΠΌΠΎΠ·Π΄ΠΊΠΎΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ начинаСтся со строки 28. Π‘Π½Π°Ρ‡Π°Π»Π° провСряСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ UseCurrentVals. Если эта пСрСмСнная содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ true, Ρ‚ΠΎ для присвоСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ printWidth ΠΈ printHeigth ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ соотвСтствСнно ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ itsWidth ΠΈ itsHeigth.

Если окаТСтся, Ρ‡Ρ‚ΠΎ пСрСмСнная UseCurrentVals содСрТит Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ false Π»ΠΈΠ±ΠΎ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π»ΠΈΠ±ΠΎ ΠΎΠ½ΠΎ являСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ установок, сдСланных ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, Ρ‚ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ printWidth ΠΈ printHeigth ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π·Π°Π΄Π°Π½Π½Ρ‹Π΅ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.

ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ Ссли UseCurrentVals истинно, Ρ‚ΠΎ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ просто ΠΈΠ³Π½ΠΎΡ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ.

Π’Ρ‹Π±ΠΎΡ€ ΠΌΠ΅ΠΆΠ΄Ρƒ значСниями ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹ΠΌΠΈ функциями

Π’ листингах 10.1 ΠΈ 10.2 Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‚ΡΡ ΠΎΠ΄Π½ΠΈ ΠΈ Ρ‚Π΅ ΠΆΠ΅ Π·Π°Π΄Π°Ρ‡ΠΈ, Π½ΠΎ использованиС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π² листингС 10.1 Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ Π±ΠΎΠ»Π΅Π΅ СстСствСнной ΠΈ Ρ‡ΠΈΡ‚Π°Π±Π΅Π»ΡŒΠ½ΠΎΠΉ. ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, Ссли Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ потрСбуСтся Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠΌΠΎΠ³ Π·Π°Π΄Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·ΠΌΠ΅Ρ€ гСомСтричСской Ρ„ΠΈΠ³ΡƒΡ€Ρ‹, Π° Π΄Ρ€ΡƒΠ³ΠΎΠΉ ΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½Π΅ составит Ρ‚Ρ€ΡƒΠ΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π½ΠΎΠ²ΡƒΡŽ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Как Ρ€Π΅ΡˆΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ слСдуСт ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ β€” ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈΠ»ΠΈ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ? ΠŸΡ€ΠΈΠΌΠΈΡ‚Π΅ ΠΊ свСдСнию ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ полоТСния. ИспользованиС ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡Ρ‚ΠΈΡ‚Π΅Π»ΡŒΠ½Π΅Π΅, Ссли:

β€’ Π½Π΅ сущСствуСт стандартных общСпринятых Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ;

β€’ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π² зависимости ΠΎΡ‚ ситуации Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΡ‹;

β€’ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠΌΠ΅Ρ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ Ρ‚ΠΈΠΏ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π΅ΠΌΡ‹Ρ… Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, принятый ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

На ΡˆΠ΅ΡΡ‚ΠΎΠΌ занятии, изучая Π±Π°Π·ΠΎΠ²Ρ‹Π΅ классы, Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ, Ρ‡Ρ‚ΠΎ Π² случаС отсутствия явного объявлСния конструктора класса ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½Π΅ содСрТит ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ Π½ΠΈΠΊΠ°ΠΊ сСбя Π½Π΅ проявляСт Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅. НС составляСт Ρ‚Ρ€ΡƒΠ΄Π° ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнный конструктор, примСняСмый ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΡ‚ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ созданиСм ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² класса.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, прСдоставляСмый компилятором, называСтся Π·Π°Π΄Π°Π½Π½Ρ‹ΠΌ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ Ρ‚ΠΎ ΠΆΠ΅ врСмя конструктором ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ называСтся Ρ‚Π°ΠΊΠΆΠ΅ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ конструктор класса, Π½Π΅ содСрТащий ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ². Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ странным, Π½ΠΎ ситуация прояснится, Ссли ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π΄Π΅Π»ΠΎ с Ρ‚ΠΎΡ‡ΠΊΠΈ зрСния примСнСния Π΄Π°Π½Π½ΠΎΠ³ΠΎ конструктора Π½Π° ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅.

ΠŸΡ€ΠΈΠΌΠΈΡ‚Π΅ ΠΊ свСдСнию, Ρ‡Ρ‚ΠΎ Ссли Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ Π±Ρ‹Π» создан ΠΊΠ°ΠΊΠΎΠΉ-Π»ΠΈΠ±ΠΎ конструктор, Ρ‚ΠΎ компилятор Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Ρ‚ΡŒ свой конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ конструктор Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², Π° Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΡƒΠΆΠ΅ создан ΠΎΠ΄ΠΈΠ½ конструктор, Ρ‚ΠΎ конструктор ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½ΡƒΠΆΠ½ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ!

ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° конструкторов

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. НапримСр, Π½Π°Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ конструктора Rectangle состоит Π² создании ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ. Π”ΠΎ запуска конструктора ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ отсутствуСт. БущСствуСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ зарСзСрвированная для Π½Π΅Π³ΠΎ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ памяти. По Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠΈ выполнСния конструктора Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ появляСтся Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ для использования ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹, ΠΊΠ°ΠΊ ΠΈ всС Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ. ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° конструкторов β€” ΠΌΠΎΡ‰Π½ΠΎΠ΅ срСдство ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности ΠΈ гибкости ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

НапримСр, рассматриваСмый Π½Π°ΠΌΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Rectangle ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ Π΄Π²Π° конструктора. Π’ ΠΏΠ΅Ρ€Π²ΠΎΠΌ задаСтся ΡˆΠΈΡ€ΠΈΠ½Π° ΠΈ Π΄Π»ΠΈΠ½Π° ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΈ для установки Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚Π° идСя Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° Π² листингС 10.3.

Листинг 10.3. ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° канструктора  

1: // Листинг 10.3.

2: // ΠŸΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ° конструктора

3:

4: #include <iostream.h>

5:

6: class Rectangle

7: {

8:    public:

9:       Rectangle();

10:      Rectangle(int width, int length);

11:      ~Rectangle() { }

12:      int GetWidth() const { return itsWidth; }

13:      int GetLength() const { return itsLength; }

14:   private:

15:      int itsWidth;

16:      int itsLength;

17: };

18:

19: Rectangle::Rectangle()

20: {

21:    itsWidth = 5;

22:    itsLength = 10;

23: }

24:

25: Rectangle::Rectangle (int width, int length)

26: {

27:    itsWidth = width;

28:    itsLength = length;

29: }

30:

31: int main()

32: {

33:    Rectangle Rect1;

34:    cout << "Rect1 width: " << Rect1.GetWidth() << endl;

35:    cout << "Rect1 length: " << Rect1.GetLength() << endl;

36:

37:    int aWidth, aLength;

38:    cout << "Enter a width: ";

39:    cin >> aWidth;

40:    cout << "\nEnter a length: ";

41:    cin >> aLength;

42:

43:    Rectangle Rect2(aWidth, aLength);

44:    cout << "\nRect2 width: " << Rect2.GetWidth() << endl;

45:    cout << "Rect2 length: " << Rect2.GetLength() << endl;

46:    return 0;

47: }


Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Rect1 width: 5

Rect1 length: 10

Enter a width: 20

Enter a length: 50

Rect2 width: 20

Rect2 length: 50


Анализ: Класс Rectangle ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ Π² строках с 6 ΠΏΠΎ 17. Π’ классС прСдставлСны Π΄Π²Π° конструктора: ΠΎΠ΄ΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ значСния ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ (строка 9), Π° Π²Ρ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ значСния Π΄Π²ΡƒΡ… цСлочислСнных ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² (строка 10). Π’ строкС 33 ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ создаСтся с использованиСм ΠΏΠ΅Ρ€Π²ΠΎΠ³ΠΎ конструктора. ЗначСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, принятыС ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, выводятся Π½Π° экран Π² строках 34 ΠΈ 35. Π‘Ρ‚Ρ€ΠΎΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ с 37 ΠΏΠΎ 41 выводят Π½Π° экран прСдлоТСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ ввСсти собствСнныС значСния ΡˆΠΈΡ€ΠΈΠ½Ρ‹ ΠΈ Π΄Π»ΠΈΠ½Ρ‹ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°. Π’ строкС 43 вызываСтся Π²Ρ‚ΠΎΡ€ΠΎΠΉ конструктор, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ Π΄Π²Π° ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° с Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‡Ρ‚ΠΎ установлСнными значСниями. И Π½Π°ΠΊΠΎΠ½Π΅Ρ†, значСния Ρ€Π°Π·ΠΌΠ΅Ρ€ΠΎΠ² ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊΠ°, установлСнныС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ, выводятся Π½Π° экран Π² строках 44 ΠΈ 45.

Как ΠΈ ΠΏΡ€ΠΈ использовании Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, компилятор Π²Ρ‹Π±ΠΈΡ€Π°Π΅Ρ‚ Π½ΡƒΠΆΠ½ΠΎΠ΅ объявлСниС конструктора, ΠΎΡΠ½ΠΎΠ²Ρ‹Π²Π°ΡΡΡŒ Π½Π° числС ΠΈ Ρ‚ΠΈΠΏΠ΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π˜Π½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²

Π”ΠΎ сих ΠΏΠΎΡ€ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² задавались прямо Π² Ρ‚Π΅Π»Π΅ конструктора. Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ конструктора происходит Π² Π΄Π²Π° этапа: инициализация ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ Ρ‚Π΅Π»Π° конструктора.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π·Π°Π΄Π°Π½ΠΎ Π½Π° любом ΠΈΠ· этих этапов: ΠΊΠ°ΠΊ Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ‚Π°ΠΊ ΠΈ Π²ΠΎ врСмя выполнСния конструктора. Но логичСски ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Π΅Π΅, Π° Π·Π°Ρ‡Π°ΡΡ‚ΡƒΡŽ ΠΈ эффСктивнСС, ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ Π²ΠΎ врСмя ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ конструктора. Π’ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ ΠΏΠΎΠΊΠ°Π·Π°Π½Π° инициализация ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…-Ρ‡Π»Π΅Π½ΠΎΠ²: