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

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

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

И вновь ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΡΡ‚ΠΈΡ‡ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ ΠΊΠ°ΠΊ ссылки, Ρ‚Π°ΠΊ ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ. Π’ листингС 9.8 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° функция, которая Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Ρ€ΠΈ значСния: Π΄Π²Π° Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ²-ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈ ΠΎΠ΄Π½ΠΎ Π² Π²ΠΈΠ΄Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Листинг 9.8. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

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

2: // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

3:

4: #include <iostream.h>

5: int

6: short Factor(int n, int* pSquared, int* pCubed);

7:

8: int main()

9: {

10:   int number, squared, cubed;

11:   short error;

12:

13:   cout << "Enter a number (0 - 20): ";

14:   cin >> number;

15:

16:   error = Factor(number, &squared, &cubed);

17:

18:   if (!error)

19:   {

20:      cout << "number: " << number << "\n";

21:      cout << "square: " << squared << "\n";

22:      cout << "cubed: " << cubed << "\n";

23:   }

24:   else

25:      cout << "Error encountered!!\n";

26:   return 0;

27: }

28:

29: short Factor(int n, int *pSquared, int *pCubed)

30: {

31:    short Value = 0;

32:    if (n > 20)

33:       Value = 1;

34:    else

35:    {

36:       *pSquared = n*n;

37:       *pCubed = n*ri*n;

38:       Value = 0;

39:    }

40:    return Value;

41: }


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

Enter a number (0-20): 3

number: 3

square: 9

cubed: 27


Анализ: Π’ строкС 10 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ number, squared ΠΈ cubed ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ΡΡ с использованиСм Ρ‚ΠΈΠΏΠ° int. ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ number присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π²Π²Π΅Π΄Π΅Π½Π½ΠΎΠ΅ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΌ. Π­Ρ‚ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Ρ‚Π°ΠΊΠΆΠ΅ адрСса ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… squared ΠΈ cubed ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‚ΡΡ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Factor() Π² Π²ΠΈΠ΄Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ².

Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Factor() анализируСтся ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Если ΠΎΠ½ большС 20 (максимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ эта функция), Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Value устанавливаСтся Ρ€Π°Π²Π½Ρ‹ΠΌ Π΅Π΄ΠΈΠ½ΠΈΡ†Π΅, Ρ‡Ρ‚ΠΎ слуТит ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ ошибки. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Factor() ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Ρ‚ΡŒ Π»ΠΈΠ±ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 1, Π»ΠΈΠ±ΠΎ 0, ΡΠ²Π»ΡΡŽΡ‰Π΅Π΅ΡΡ ΠΏΡ€ΠΈΠ·Π½Π°ΠΊΠΎΠΌ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ всС ΠΏΡ€ΠΎΡˆΠ»ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ функция Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ лишь Π² строкС 40.

Π˜Ρ‚Π°ΠΊ, искомыС значСния (ΠΊΠ²Π°Π΄Ρ€Π°Ρ‚ ΠΈ ΠΊΡƒΠ± Π·Π°Π΄Π°Π½Π½ΠΎΠ³ΠΎ числа) Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Π² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ Π½Π΅ ΠΏΡƒΡ‚Π΅ΠΌ использования ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ° Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ, Π° Π·Π° счСт измСнСния Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Ρ‹ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ.

Π’ строках 36 ΠΈ 37 посрСдством ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() ΠΏΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°ΡŽΡ‚ΡΡ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Π΅ значСния. Π’ строкС 38 ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Value присваиваСтся Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π°, ΠΎΠ·Π½Π°Ρ‡Π°ΡŽΡ‰Π΅Π΅ ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎΠ΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ строкС 40 это Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Value возвращаСтся Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

Π­Ρ‚Ρƒ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡƒ ΠΌΠΎΠΆΠ½ΠΎ слСгка ΡƒΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ, Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΠ² Π΅Π΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ объявлСниСм:

enum ERROR_VALUE { SUCCESS, FAILURE} ;

Π—Π°Ρ‚Π΅ΠΌ вмСсто Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ 0 ΠΈΠ»ΠΈ 1 эта ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° смоТСт Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Ρ‚ΡŒ SUCCESS Π˜Π›Π˜ FAILURE.

Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ссылок

НСсмотря Π½Π° Ρ‚ΠΎ Ρ‡Ρ‚ΠΎ листинг 9.8 прСкрасно Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠΏΡ€ΠΎΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠ°ΠΊ для чтСния, Ρ‚Π°ΠΊ ΠΈ Π² эксплуатации, Ссли вмСсто ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ссылки. Π’ листингС 9.9 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° Ρ‚Π° ΠΆΠ΅ самая ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ°, Π½ΠΎ вмСсто ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π² качСствС ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² Π½Π΅ΠΉ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ссылки, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΎ упомянутоС Π²Ρ‹ΡˆΠ΅ пСрСчислСниС ERROR.

Листинг 9.9. Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ссылок

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

2: // Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

3: // с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ссылок

4:

5: #include <iostream.h>

6:

7: typedef unsigned short USHORT;

8: enum ERR_CODE { SUCCESS, ERROR }

9:

10: ERR_CODE Factor(USHORT, USHORT&, USHORT&);

11:

12: int main()

13: {

14:    USHORT number, sguared, cubed;

15:    ERR__CODE result;

16:

17:    cout << "Enter Π° number (0 - 20): ";

18:    cin >> number;

19:

20:    result = Factor(number, squared, cubed);

21:   

22:    if (result == SUCCESS)

23:    {

24:       cout << "number: " << number << "\n";

25:       cout << "square: " << squared << "\n";

26:       cout << "cubed: " << cubed << "\n";

27:    }

28:    else

29:       cout << "Error encountered!!\n";

30:    return 0;

31: }

32:

33: ERR_CODE Factor(USHORT n, USHORT &rSquared, USHORT &rCubed)

34: {

35:    if (n > 20)

36:       return ERROR; // simple error code

37:    else

38:    {

39:       rSquared = n*n;

40:       rCubed = n*n*n;

41:       return SUCCESS;

42:    }

43: }


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

Enter a number (0 - 20): 3

number: 3

square: 9

cubed: 27


Анализ: Листинг 9.9 ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½ листингу 9.8 с двумя ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡΠΌΠΈ. ΠŸΠ΅Ρ€Π΅Ρ‡ΠΈΡΠ»Π΅Π½ΠΈΠ΅ ERR_CODE Π΄Π΅Π»Π°Π΅Ρ‚ сообщСниС ΠΎΠ± ошибкС Π±ΠΎΠ»Π΅Π΅ явным (см. строки 36 ΠΈ 41), ΠΊΠ°ΠΊ, Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ, ΠΈ Π΅Π³ΠΎ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ (строка 22).

Однако Π±ΠΎΠ»Π΅Π΅ сущСствСнныС измСнСния ΠΊΠΎΡΠ½ΡƒΠ»ΠΈΡΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Factor(). Π’Π΅ΠΏΠ΅Ρ€ΡŒ эта функция ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ для принятия Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ, Π° ссылок Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ squared ΠΈ cubed, Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ манипуляции Π½Π°Π΄ этими ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ Π³ΠΎΡ€Π°Π·Π΄ΠΎ ΠΏΡ€ΠΎΡ‰Π΅ ΠΈ Π»Π΅Π³Ρ‡Π΅ для понимания.

ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΡΡΡ‹Π»ΠΎΠΊ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ ΠΊΠ°ΠΊ срСдство ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности

ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ ΠΊΠ°ΠΊ значСния создаСтся копия этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. ΠŸΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ создаСтся Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° копия.

На занятии 5 Π²Ρ‹ ΡƒΠ·Π½Π°Π»ΠΈ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΊΠΎΠΏΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² стСк ΠΈ Π½Π° этот процСсс расходуСтся врСмя ΠΈ ΠΏΠ°ΠΌΡΡ‚ΡŒ. Для Ρ‚Π°ΠΊΠΈΡ… ΠΌΠ°Π»Π΅Π½ΡŒΠΊΠΈΡ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², ΠΊΠ°ΠΊ Π±Π°Π·ΠΎΠ²Ρ‹Π΅ цСлочислСнныС значСния, Ρ†Π΅Π½Π° этих расходов Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°.

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

ΠšΡ€ΠΎΠΌΠ΅ Ρ‚ΠΎΠ³ΠΎ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ расходы. ΠŸΡ€ΠΈ создании Π²Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… ΠΊΠΎΠΏΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² классов для этих Ρ†Π΅Π»Π΅ΠΉ компилятор Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ конструктор-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ. ,Ha ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΌ занятии Π²Ρ‹ ΡƒΠ·Π½Π°Π΅Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ конструкторы-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΈ ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ собствСнный конструктор-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ, Π½ΠΎ ΠΏΠΎΠΊΠ° достаточно Π·Π½Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ конструктор-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ вызываСтся ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π·, ΠΊΠΎΠ³Π΄Π° Π² стСк помСщаСтся врСмСнная копия ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

ΠŸΡ€ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½ΠΈΠΈ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ происходит ΠΏΡ€ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π΅ ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, вызываСтся дСструктор ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°. Если ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ возвращаСтся Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠ΅ΠΉ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, копия этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ сначала создана, Π° Π·Π°Ρ‚Π΅ΠΌ Ρ€Π°Π·Ρ€ΡƒΡˆΠ΅Π½Π°.

ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с большими ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ эти Π²Ρ‹Π·ΠΎΠ²Ρ‹ конструктора ΠΈ дСструктора ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ слишком ΠΎΡ‰ΡƒΡ‚ΠΈΠΌΠΎΠ΅ влияниС Π½Π° ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ использованиС памяти ΠΊΠΎΠΌΠΏΡŒΡŽΡ‚Π΅Ρ€Π°. Для ΠΈΠ»Π»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΠΈ этой ΠΈΠ΄Π΅ΠΈ Π² листингС 9.10 создаСтся ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ SimpleCat. Π Π΅Π°Π»ΡŒΠ½Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠΌΠ΅Π» Π±Ρ‹ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ побольшС ΠΈ обошСлся Π±Ρ‹ Π΄ΠΎΡ€ΠΎΠΆΠ΅, Π½ΠΎ ΠΈ этого ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° Π²ΠΏΠΎΠ»Π½Π΅ достаточно, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, насколько часто Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ конструктор-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ ΠΈ дСструктор.

Π˜Ρ‚Π°ΠΊ, Π² листингС 9.10 создаСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ SimpleCat, послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄Π²Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. ΠŸΠ΅Ρ€Π²Π°Ρ функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Cat ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π΅Π³ΠΎ ΠΊΠ°ΠΊ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Вторая ΠΆΠ΅ функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π° Π½Π΅ сам ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚.

Листинг 9.10. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠ°ΠΊ ссылок с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

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

2: // ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹

3:

4: #include <iostream.h>

5:

6: class SimpleCat

7: {

8:    public:

9:       SimpleCat (); // конструктор

10:      SimpleCat(SimpleCat&); // конструктор-ΠΊΠΎΠΏΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊ

11:      ~SimpleCat(); // дСструктор

12: };

13:

14: SimpleCat::SimpleCat()

15: {

16:    cout << "Simple Cat Constructor...\n";

17: }

18:

19: SimpleCat::SimpleCat(SimpleCat&)

20: {

21: cout << "Simple Cat Copy Constructor...\n";

22: }

23:

24: SimpleCat::~SimpleCat()

25: {

26: cout << "Simple Cat Destructor...\n";

27: }

28:

29: SimpleCat Function0ne (SimpleCat theCat);

30: SimpleCat* FunctionTwo (SimpleCat *theCat);

31:

32: int main()

33: {

34:    cout << "Making a cat,.,\n";

35:    SimpleCat Frisky;

36:    cout << "Calling FunctionOne,,,\n";

37:    FunctionOne(Frisky);

38:    cout << "Calling FunctionTwo..,\n";

39:    FunctionTwo(&Frisky);

40:    return 0;

41: }

42:

43: // Ѐункция FunctionOne, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΊΠ°ΠΊ значСния

44: SimpleCat FunctionOne(SimpleCat theCat)

45: {

46:    cout << "Function One. Roturning,,,\ri";

47:    return theCat;

48: }

49:

50: // Ѐункция FunctionTwo, ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° ΠΊΠ°ΠΊ ссылки

51: SimpleCat* FunctionTwo (SimpleCat *theCat)

52: {

53:    cout << "Function Two. Returning...\n";

54:    return theCat;

55: }


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

Making a cat...

Simple Cat Constructor...

Calling FunctionOne...

Simple Cat Copy Constructor...

Function One. Returning...

Simple Cat Copy Constructor...

Simple Cat Destructor...

Simple Cat Destructor...

Calling FunctionTwo...

Function Two. Returning...

Simple Cat Destructor...


ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅:НомСра строк Π½Π΅ выводятся. ΠœΡ‹ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΈΡ… для удобства провСдСния Π°Π½Π°Π»ΠΈΠ·Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.