Skip to content

leti9005/prog_2sem_read

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

3 Commits
Β 
Β 
Β 
Β 

Repository files navigation

1. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹

Π€ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΌΠΎΠ΄ΡƒΠ»ΠΈ, классы

2. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΡ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ ΠΈ ΡΡ‚ΠΈΠ»ΡŒ ΠΈΡ… описания

ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½ ΠΆΠ΅ называСтся объявлСниСм Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… частСй

[Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния] [имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ] ([Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ]);

НазначСниС ΠΏΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏΠ° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ - ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ описании Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ для компилятора. Оно Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΎ Π΄ΠΎ опрСдСлСния самой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ(Ρ‚Π΅Π»ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ). ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π΅Π³ΠΎ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π°ΡŽΡ‚ Π² Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΡ‡Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅, Ссли прСдполагаСтся Π΅Π³ΠΎ использованиС Π² Π΄Ρ€ΡƒΠ³ΠΈΡ… модулях компиляции ΠΈΠ»ΠΈ Π² Π½Π°Ρ‡Π°Π»Π΅ модуля компиляции, Ссли функция Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² Π½Π΅ΠΌ.

ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

int foo(float a, float b);

int Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния

foo имя Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

a ΠΈ b - Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹

Если функция Π½Π΅ ΠΏΠΎΠ΄Ρ€Π°Π·ΡƒΠΌΠ΅Π²Π°Π΅Ρ‚ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния, Ρ‚ΠΎ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния указываСтся void. ΠŸΡ€ΠΎΡ‚ΠΎΡ‚ΠΈΠΏ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ отличаСтся ΠΎΡ‚ Π΅Π΅ опрСдСлСния отсутствиСм Ρ‚Π΅Π»Π°.

#include <iostream>

int sum(int a, int b); // ОбъявлСниС

int main() {
  std::cout << sum(4,5) << std::endl;
  return 0;
}

int sum(int a, int b) { // ΠžΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅
  int result = 0;
  result = a + b;
  return result;
}

3. ΠšΠ»Π°ΡΡΡ‹ памяти ΠΈ области видимости ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… Π² функциях

Класс памяти ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½ΠΈΠ΅ ΠΈ дальнСйшСС использования ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ. По-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, пСрСмСнная ΠΈΠΌΠ΅Π΅Ρ‚ класс auto, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ‰Π΅Π½Π° Π² области видимости, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ объявлСна. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами, это обычная локальная пСрСмСнная, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π°Ρ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ области видимости - Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, модуля, класса. Π­Ρ‚ΠΎΡ‚ класс Π½Π΅ Π½Π°Π΄ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ, всС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€ΠΎΠ² ΡΠ²Π»ΡΡŽΡ‚ΡΡ Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ. Π’Π°ΠΆΠ½ΠΎ Π½Π΅ ΠΏΡƒΡ‚Π°Ρ‚ΡŒ описаниС класса памяти auto ΠΈ Ρ‚ΠΈΠΏΠ° ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ auto!

extern ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ пСрСмСнная внСшняя, Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ Π΅Π΅ объявлСниС находится Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

static ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ пСрСмСнная сугубо внутрСнняя, доступна Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„Π°ΠΉΠ»Π°. Π’Π°ΠΆΠ½ΠΎΠΉ ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒΡŽ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ссли пСрСмСнная объявлСна static Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, ΠΎΠ½Π° просущСствуСт всС врСмя выполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

#include <iostream>

int inc() {
  static int x = 0;
  x++;
  return x;
}

int main() {
  std::cout << inc();
  std::cout << inc();
  std::cout << inc();
  return 0;
}

Π­Ρ‚Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ 1,2,3;

#include <iostream>

int inc() {
  int x = 0;
  x++;
  return x;
}

int main() {
  std::cout << inc() << ",";
  std::cout << inc() << ",";
  std::cout << inc();
  return 0;
}

Π° Ссли ΡƒΠ±Ρ€Π°Ρ‚ΡŒ слово static Π½Π° экран Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π²Π΅Π΄Π΅Π½ΠΎ 1,1,1

register ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠΉ класс памяти, ΠΏΠΎΠ΄ΡΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ компилятору, Ρ‡Ρ‚ΠΎ эту ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ слСдуСт Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ рСгистрС процСссора. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ускорСния Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Ρ‚.ΠΊ. доступ ΠΊ рСгистрам процСссора быстрСС, Ρ‡Π΅ΠΌ доступ ΠΊ памяти. Π’ настоящСС врСмя компиляторы достаточно ΡƒΠΌΠ½Ρ‹, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ. ЯвляСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ подсказкой ΠΈ Π½ΠΈ ΠΊ Ρ‡Π΅ΠΌΡƒ Π² настоящСС врСмя Π½Π΅ обязываСт.

thread_local ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ пСрСмСнная относится ΠΊ ΠΏΠΎΡ‚ΠΎΠΊΡƒ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ создана, ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ с static ΠΈ extern

4. Π’ΠΈΠΏΡ‹ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΡ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ

Π’ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· встроСнных. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ структура, класс, Π² Ρ‚ΠΎΠΌ числС ΠΈ собствСнныС. Π’ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния опрСдСляСтся ΠΏΡ€ΠΈ Π΅Π΅ объявлСнии.

5. Бпособы ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡ΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ

АргумСнты ΠΌΠΎΠ³ΡƒΡ‚ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ (by value) ΠΈ ΠΏΠΎ ссылкС (by reference). ΠŸΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ внСшний ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ пСрСдаСтся Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ Π² этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ пСрСдаСтся само Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ этого ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

#include <iostream>

int inc(int x) {
  x++;
  return x;
}

int main() {
  int x = 0;
  std::cout << inc(x) << ",";
  std::cout << x;
  return 0;
}

Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ 1,0, Ρ‚.ΠΊ. Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ пСрСмСнная Π±Ρ‹Π»Π° ΠΏΠ΅Π΄Π΅Ρ€Π°Π½Π° ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами Π±Ρ‹Π»Π° ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π° копия ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ, Π° Π½Π΅ сама пСрСмСнная. Π‘Ρ‚ΠΎΠΈΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² ΡƒΠΊΠ°Π·Π°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ компилятор ΠΏΠ΅Ρ€Π΅Π΄Π°Π» ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠΎ ссылкС:

 #include <iostream>
 
 int inc(int &x) {
   x++;
   return x;
 }
 
 int main() {
   int x = 0;
   std::cout << inc(x) << ",";
   std::cout << x;
   return 0;
 }

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

ПолСзно ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ const ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ Π²Π½ΡƒΡ‚Ρ€ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈΠ·ΠΌΠ΅Π½ΡΡ‚ΡŒ нСльзя.

int inc(const int x) {
  x++;
  return x;
}

ΠΈ компилятор выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ error: increment of read-only parameter β€˜x’

6. ΠŸΠ΅Ρ€Π΅Π΄Π°Ρ‡Π° массивов Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ²

Если функция ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ Π² качСствС Π°Π³Ρ€ΡƒΠΌΠ΅Π½Ρ‚Π° массив, Ρ‚ΠΎ фактичСски Π² эту Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ пСрСдаСтся ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт массива, ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π·Π° нас компилятор. Как ΠΈ Π² случаС с указатСлями Π½Π°ΠΌ доступСн адрСс, ΠΏΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΌΠ΅Π½ΡΡ‚ΡŒ значСния. НапримСр, записи :

int sum(int x[], int len) {
  int sum = 0;
  for(int i = 0;i<len;i++) {
    sum += x[i];
  }
  return sum;
}

ΠΈ

int sum(int *x, int len) {
  int sum = 0;
  for(int i = 0;i<len;i++) {
    sum += x[i];
  }
  return sum;
}

Ρ€Π°Π²Π½ΠΎΠ·Π½Π°Ρ‡Π½Ρ‹.

И Π½Π΅ Π·Π°Π±Ρ‹Π²Π°Π΅ΠΌ ΠΏΡ€ΠΎ слово const:

int sum(const int x[], const int len) {
  int sum = 0;
  for(int i = 0;i<len;i++) {
    sum += x[i];
    x[i] += sum;
  }
  return sum;
}

выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΏΡ€ΠΈ компиляции.

7. АргумСнты ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ

Π’ Π‘++ Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π°Π³Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Ссли ΡƒΠΊΠ°Π·Π°Π½ΠΎ ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ Π½Π° ΠΈΡ… мСсто Π² Ρ‚Π°ΠΊΠΎΠΌ случаС. НапримСр:

#include <iostream>

int sum(int x[], int len = 4) {
  int sum = 0;
  for(int i = 0;i<len;i++) {
    sum += x[i];
  }
  return sum;
}

int main() {
  int x[] = {1,2,3,4};
  std::cout << sum(x) << std::endl;
  return 0;
}

Если Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π° len, Π±ΡƒΠ΄Π΅Ρ‚ подставлСно Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ 4. Π‘Ρ‚ΠΎΠΈΡ‚ Π»ΠΈ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ссли массив Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎΠ³ΠΎ ΠΎΡ‚ 4, функция ΠΎΡ‚Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ этот ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π½Π°Π΄ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ с ΠΎΡΡ‚ΠΎΡ€ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ. Π’ΠΎΡ‚ бСзопасный ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

#include <iostream>

int sum(const int x[], int len, bool print = false) {
  int sum = 0;
  for(int i = 0;i<len;i++) {
    sum += x[i];
  }
  if(print) {
    std::cout << sum << std::endl;
  }
  return sum;
}

int main() {
  int x[] = {1,2,3,4};
  sum(x, 4);
  sum(x, 4, true);
  return 0;
}

Если для ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΡƒΠΊΠ°Π·Π°Π½ΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‚ΠΎΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΈΠΌΠ΅Ρ‚ΡŒ Ρ‚Π°ΠΊΠΈΠ΅ значСния:

#include <iostream>

int sum(const int x[], bool print = false, int len) {
  int sum = 0;
  for(int i = 0;i<len;i++) {
    sum += x[i];
  }
  if(print) {
    std::cout << sum << std::endl;
  }
  return sum;
}

int main() {
  int x[] = {1,2,3,4};
  sum(x, 4);
  return 0;
}

Вакая запись ΡƒΠΆΠ΅ Π½Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Π°, ΠΎ Ρ‡Π΅ΠΌ компилятор сообщит.

8. ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ(ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠ°) Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ

ΠŸΠΎΠ»ΠΈΠΌΠΎΡ€Ρ„ΠΈΠ·ΠΌ позволяСт ΠΎΠ±ΡŠΡΠ²Π»ΡΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ с ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ, Π½ΠΎ Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Π°ΠΌΠΈ. Π­Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ относится ΠΊΠ°ΠΊ ΠΊ Ρ‚ΠΈΠΏΠ°ΠΌ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ², Ρ‚Π°ΠΊ ΠΈ ΠΊ ΠΈΡ… количСству. Π’ процСссС компиляции компилятор сам Π²Ρ‹Π±Π΅Ρ€Π΅Ρ‚ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½Π°Π΄ΠΎ Π²Ρ‹Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° основании Ρ‚ΠΈΠΏΠΎΠ² Π΅Π΅ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ².

#include <iostream>

int add(int a, int b) {
  return a+b;
}

double add(double a, double b) {
  return a+b;
}

int main() {
  int x = 3, y = 5;
  int z = add(x,y);
  std::cout << z << std::endl;

  double alpha = 7.0, beta = 11.0;
  double delta = add(alpha, beta);
  std::cout << delta << std::endl;

  return 0;
}

Π‘Ρ‚ΠΎΠΈΡ‚ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π²Π½ΠΈΠΌΠ΅Π½ΠΈΠ΅ Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Ρ‚ΠΈΠΏ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния Π½Π΅ влияСт Π½Π° Π²Ρ‹Π±ΠΎΡ€ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ. Π’ΠΎΡ‚ ΠΊΠΎΠ΄, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ компилятор выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ:

#include <iostream>

int add(int a, int b) {
  return a+b;
}

double add(int a, int b) {
  return a+b;
}

int main() {
  int x = 3, y = 5;
  int z = add(x,y);
  std::cout << z << std::endl;

  return 0;
}

9. Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ классы Π² Π‘++

Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Ρ‹ ΠΈ классы ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Ρ‹ для опрСдСлСния ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ². ΠšΠ»Π°ΡΡΡ‹ ΠΈ структуры ΠΌΠΎΠ³ΡƒΡ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅-Ρ‡Π»Π΅Π½Ρ‹ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ-Ρ‡Π»Π΅Π½Ρ‹, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ состояниС ΠΈ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π΄Π°Π½Π½ΠΎΠ³ΠΎ Ρ‚ΠΈΠΏΠ°.

Π’ C++ классы ΠΈ структуры ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½Ρ‹, Π·Π° ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ Ρ‚ΠΎΠ³ΠΎ Ρ„Π°ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ структуры ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ для доступа, Π° классы β€” Π·Π°ΠΊΡ€Ρ‹Ρ‚Ρ‹.

Объявим структуру AStruct ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ Π½Π΅ΠΉ:

#include <iostream>

struct AStruct {
  AStruct() { x = 0; y = 0; }
  int x;
  int y;
};

int main() {

  AStruct a;
  a.x = 4;
  a.y = 5;
  std::cout << a.x << "," << a.y << std::endl;

  return 0;
}

Как Π²ΠΈΠ΄Π½ΠΎ, Ρƒ структуры Π΅ΡΡ‚ΡŒ конструктор ΠΈ Π΄Π²Π° Ρ‡Π»Π΅Π½Π° x ΠΈ y. ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π½ΠΈΠΌ, ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅. Однако, стоит ΠΏΠΎΠΌΠ΅Π½ΡΡ‚ΡŒ struct Π½Π° class:

#include <iostream>

class AStruct {
  AStruct() { x = 0; y = 0; }
  int x;
  int y;
};

int main() {

  AStruct a;
  a.x = 4;
  a.y = 5;
  std::cout << a.x << "," << a.y << std::endl;

  return 0;
}

И компилятор ΡƒΠΆΠ΅ выдаст ΠΎΡˆΠΈΠ±ΠΊΡƒ ΠΎ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ доступа ΠΊ полю Ρ‚ΠΈΠΏΠ° private. Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π° public Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ:

class AStruct {
public:
  AStruct() { x = 0; y = 0; }
  int x;
  int y;
};

10. Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ классов

ΠšΠ»Π°ΡΡΡ‹ это концСпция ΠΈΠ· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎ-ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ программирования, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰Π°Ρ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ Π²Π²ΠΎΠ΄ΠΈΡ‚ΡŒ свои Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, объСдиняя Π΄Π°Π½Π½Ρ‹Π΅ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½ΠΈΠΌΠΈ(инкапсуляция). Π­Ρ‚ΠΎ ΠΏΠΎΠ²Ρ‹ΡˆΠ°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°, ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈ ΠΏΡ€ΠΎΡ‡. ΠΏΡ€ΠΎΡ‡. Бмысл классов Π² объСдинСниС Π΄Π°Π½Π½Ρ‹Ρ… с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈΡ… ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΈ хранСния ΠΈΡ… Π²Π·Π°ΠΈΠΌΠ½ΠΎΠ³ΠΎ состояния. Π’Π°ΠΆΠ½Π΅ΠΉΡˆΠΈΠΌ свойством классов являСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈΡ… наслСдования. Π”Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами класс – это описаниС мноТСства ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² программирования (ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ²) ΠΈ выполняСмых Π½Π°Π΄ Π½ΠΈΠΌΠΈ дСйствий. НапримСр, опишСм Π΄Π²Π° класса Point ΠΈ Vector.

#include <iostream>
#include <cmath>

class Point {

protected:
  int x;
  int y;

private:
  void _reset() {
    x = 0;
    y = 0;
  }
public:
  void Move(int newX, int newY) {
    if(newX >= 0 && newY >= 0) {
      x = newX;
      y = newY;
    }
  }

  Point() {
    _reset();
  }

};

class Vector : public Point {
public:
  double Length() {
    return sqrt(x*x+y*y);
  }

  Vector() {
    std::cout << "Vector created" << std::endl;
  }

  ~Vector() {
    std::cout << "Vector destroyed" << std::endl;
  }
  
};

int main() {
  Vector v;
  v.Move(1,1);

  std::cout << v.Length() << std::endl;

  return 0;
}

Π£ класса Point Π΅ΡΡ‚ΡŒ Π΄Π²Π° поля x ΠΈ y, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Ρ€Π°ΠΆΠ°ΡŽΡ‚ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² пространствС. ΠœΠ΅Ρ‚ΠΎΠ΄ _reset() устаналвиваСт Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ Π² Π½Π°Ρ‡Π°Π»ΠΎ систСмы ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚, ΠΌΠ΅Ρ‚ΠΎΠ΄ Move(), измСняСт ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ Ρ‚ΠΎΡ‡ΠΊΠΈ Π² пространствС.

ΠœΠ΅Ρ‚ΠΎΠ΄ _reset() являСтся ΠΏΡ€ΠΈΠ²Π°Ρ‚Π½Ρ‹ΠΌ, Ρ‚.ΠΊ. находится Π² области private. Π­Ρ‚ΠΎ Π΄Π΅Π»Π°Π΅Ρ‚ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Π½Π΅ΠΌΡƒ нСдоступным ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… классов, Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ словами это чисто Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄.

ΠœΠ΅Ρ‚ΠΎΠ΄ Move() Π½Π°ΠΎΠ±ΠΎΡ€ΠΎΡ‚, объявлСн Π² области public, которая Π΄Π΅Π»Π°Π΅Ρ‚ Π΅Π³ΠΎ доступным ΠΊ использованию снаруТи. Π­Ρ‚ΠΎ позволяСт обращатся ΠΊ Π½Π΅ΠΌΡƒ ΠΈΠ· любой части ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹.

ΠšΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ x ΠΈ y ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹ protected. Он Π·Π°Ρ‰ΠΈΡ‰Ρ‘Π½Π½Ρ‹ΠΉ, Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠΉ Ρ‡Π»Π΅Π½ ΠΈΠ΅Ρ€Π°Ρ€Ρ…ΠΈΠΈ классов) β€” обращСния ΠΊ Ρ‡Π»Π΅Π½Ρƒ Π΄ΠΎΠΏΡƒΡΠΊΠ°ΡŽΡ‚ΡΡ ΠΈΠ· ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Ρ‚ΠΎΠ³ΠΎ класса, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ этот Ρ‡Π»Π΅Π½ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Ρ‘Π½, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΈΠ· Π»ΡŽΠ±Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² Π΅Π³ΠΎ классов-наслСдников. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: private поля Π·Π°ΠΏΡ€Π΅Ρ‰Π΅Π½Ρ‹ ΠΊ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΡŽ ΠΈ ΠΈΠ· наслСдников! НаслСдованиС ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ protected Π΄Π΅Π»Π°Π΅Ρ‚ всС public-Ρ‡Π»Π΅Π½Ρ‹ Ρ€ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ класса protected-Ρ‡Π»Π΅Π½Π°ΠΌΠΈ класса-наслСдника;

Класс Vector, ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для дСмонстрации наслСдования. Он наслСдуСт ΠΎΡ‚ своСго родитСля Point понятия ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ Move(). Однако, Ρƒ Π²Π΅ΠΊΡ‚ΠΎΡ€Π° Π΅ΡΡ‚ΡŒ понятиС Π΄Π»ΠΈΠ½Ρ‹, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ Lenght().

Для классов Π΅ΡΡ‚ΡŒ Π΄Π²Π° ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΌΠ΅Ρ‚ΠΎΠ΄Π°: конструктор - Vector() ΠΈ дСструктор ~Vector().

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ вызываСтся ΠΏΡ€ΠΈ создании экзСмпляра класса, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ называСтся ΠΎΠ±ΡŠΠ΅ΠΊΡ‚(ΠΎΠ± этом Π½ΠΈΠΆΠ΅).

ДСструктор вызываСтся ΠΏΡ€ΠΈ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

11. Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ²

ΠŸΠΎΠ½ΡΡ‚ΠΈΠ΅ инкапсуляции ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ объСдинСниС Π΄Π°Π½Π½Ρ‹Ρ… ΠΈ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π½ΠΈΠΌΠΈ. ОбъСдинСниС ΠΈΠ·ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΡ… Π² Π½Π΅ΠΊΠΎΠΉ капсулС, ΠΎΡΡ‚ΡŽΠ΄Π° ΠΈ Π½Π°Π·Π²Π°Π½ΠΈΠ΅.

Π˜Π½ΠΊΠ°ΠΏΡΡƒΠ»ΡΡ†ΠΈΡ позволяСт ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π°Π½Π½Ρ‹Π΅, хранящиСся Π² ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π΅ ΠΎΡ‚ прямых Π²Π½Π΅ΡˆΠ½ΠΈΡ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. НапримСр, Π² ΠΏΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰Π΅ΠΌ ΠΏΠ°Ρ€Π°Π³Ρ€Π°Ρ„Π΅ ΠΌΡ‹ ΡƒΠ±ΠΈΡ€Π°Π΅ΠΌ x ΠΈ y Π² ΠΎΠ±Π»Π°ΡΡ‚ΡŒ private, Ρ‡Ρ‚ΠΎΠ±Ρ‹ измСнСния ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚ происходили Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π²Π΅Π΄ΠΎΠΌΠ° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ Move(), Π’ Π½Π΅ΠΌ условный ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ if, Π½Π΅ позволяСт Π·Π°Π΄Π°Ρ‚ΡŒ ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚Ρ‹ мСньшС 0, Ссли Π±Ρ‹ внСшний ΠΊΠΎΠ΄ ΠΈΠΌΠ΅Π» доступ ΠΊ полям x ΠΈ y, это Π±Ρ‹Π»ΠΎ Π±Ρ‹ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. Π’ Ρ‚ΠΎΠΌ числС это избавляСт внСшний ΠΊΠΎΠ΄, ΠΎΡ‚ нСобходимости ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ коррСктности ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚(Ссли внСшний ΠΊΠΎΠ΄ являСтся "Π΄ΠΎΠ±Ρ€Ρ‹ΠΌ ΠΈ ΠΏΡƒΡˆΠΈΡΡ‚Ρ‹ΠΌ" ΠΈ Ρƒ Π½Π΅Π³ΠΎ Π½Π΅Ρ‚ Ρ†Π΅Π»ΠΈ Π½Π°ΠΌ всС ΠΏΠΎΠ»ΠΎΠΌΠ°Ρ‚ΡŒ).

Π’Π°ΠΊ ΠΆΠ΅ инкапсуляция экономит мСсто:

#include <iostream>
#include <cmath>

class Point {

protected:
  int x;
  int y;

public:
  void Move(int newX, int newY) {
    x = newX;
    y = newY;
  }

  Point() {
    x = 0;
    y = 0;
  }

};

class Vector : public Point {
public:
  double Length() {
    return sqrt(x*x+y*y);
  }

  Vector() {
    std::cout << "Vector created" << std::endl;
  }

  ~Vector() {
    std::cout << "Vector destroyed" << std::endl;
  }

};

int main() {
  Vector v;
  int X = 1, Y = 1;

  if(X >= 0 && Y >= 0) {
    v.Move(X, Y);
  }

  std::cout << v.Length() << std::endl;

  X = 17; Y = 12;

  if(X >= 0 && Y >= 0) {
    v.Move(X, Y);
  }

  std::cout << v.Length() << std::endl;

  return 0;
}

Π’ΠΎ Π΅ΡΡ‚ΡŒ, Π²ΠΎΠ·Π»ΠΎΠΆΠΈΠ² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π½Π° внСшний ΠΊΠΎΠ΄, ΠΌΡ‹ Π²Ρ‹Π½ΡƒΠ΄ΠΈΠ»ΠΈ Π΅Π³ΠΎ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Ρ€Π°Π· ΠΏΠ΅Ρ€Π΅Π΄ Move() ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΡ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠΎΡ€Π΄ΠΈΠ½Π°Ρ‚. Код Π½ΠΈΠΆΠ΅ - ΠΊΠΎΠΌΠΏΠ°ΠΊΡ‚Π½Π΅Π΅:

#include <iostream>
#include <cmath>

class Point {

protected:
  int x;
  int y;

public:
  void Move(int newX, int newY) {
    if (newX >= 0 && newY >= 0) {
      x = newX;
      y = newY;
    }
  }

  Point() {
    x = 0;
    y = 0;
  }

};

class Vector : public Point {
public:
  double Length() {
    return sqrt(x*x+y*y);
  }

  Vector() {
    std::cout << "Vector created" << std::endl;
  }

  ~Vector() {
    std::cout << "Vector destroyed" << std::endl;
  }

};

int main() {
  Vector v;

  int X = 1, Y = 1;
  v.Move(X, Y);
  std::cout << v.Length() << std::endl;

  X = 17; Y = 12;
  v.Move(X, Y);
  std::cout << v.Length() << std::endl;

  return 0;
}

Π’Π°ΠΊΠΎΠΉ ΠΊΠΎΠ΄ ΠΏΡ€ΠΎΡ‰Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°ΡΡˆΠΈΡ€ΡΡ‚ΡŒ. НапримСр, Ссли Π² нашСм Π²ΠΈΡ€Ρ‚Π°ΡƒΠ»ΡŒΠ½ΠΎΠΌ ΠΌΠΈΡ€Π΅ Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² всС-Ρ‚Π°ΠΊΠΈ станут Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ ΠΊΠΎΠΎΡ€ΠΈΠ΄ΠΈΠ½Π°Ρ‚Ρ‹ мСньшиС 0, Ρ‚ΠΎ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π½Π°Π΄ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΌ мСстС - Π² ΠΌΠ΅Ρ‚ΠΎΠ΄Π΅ Move(), Π° Π½Π΅ Π² Π΄Π²ΡƒΡ…(тысячах ;)) мСст Π²ΠΎ внСшнСм ΠΊΠΎΠ΄Π΅.

12. ΠžΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹, ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΠΈ способы доступа ΠΊ Π½ΠΈΠΌ

ΠžΠ±ΡŠΠ΅ΠΊΡ‚ это экзСмпляр класса. Π’ΠΎ Π΅ΡΡ‚ΡŒ это пСрСмСнная ΠΈΠΌΠ΅ΡŽΡ‰Π°Ρ Ρ‚ΠΈΠΏ, ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ классу. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с Ρ‚ΠΎΡ‡ΠΊΠ°ΠΌΠΈ ΠΈ Π²Π΅ΠΊΡ‚ΠΎΡ€Π°ΠΌΠΈ, пСрСмСнная v это ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Vector, которая позволяСт Π½Π°ΠΌ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ с ΠΌΠ΅Ρ‚ΠΎΠ΄Π°ΠΌΠΈ ΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ инкапсулированны Π² класс Vector. Π’ Π΄Π°Π½Π½ΠΎΠΌ случаС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ создаСтся ΠΏΡ€ΠΈ объявлСнии ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Vector v;, Π½ΠΎ это Π½Π΅ всСгда ΡƒΠ΄ΠΎΠ±Π½ΠΎ, поэтому сущСствуСт способ динамичСского создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π²Ρ‹Π·ΠΎΠ²Π° new.

Π’Ρ‹Π·ΠΎΠ² new Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠΎΠ½ΠΊΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ класса ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° созданый ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ для дальнСйшСго использования.

#include <iostream>

class Point {
  int x;
  int y;

public:
  Point() {
    std::cout << "Creating point" << std::endl;
    x = 0;
    y = 0;
  }
};

int main() {
  Point *p = new Point();
  std::cout << p << std::endl;

  return 0;
}

Π’ этом ΠΊΠΎΠ΄Π΅ ΠΌΡ‹ объявляСм класс Point, Π·Π°Ρ‚Π΅ΠΌ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main() создаСм ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ Ρ‚ΠΈΠΏΠ° "ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ класса Point" ΠΈ присваиваСм Π΅ΠΌΡƒ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²Ρ‹Π·ΠΎΠ² new. Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ сам ΠΏΠΎ сСбС ΠΈ Π½Π΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° ΠΊΠ°ΠΊΠΎΠΉ Π»ΠΈΠ±ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. По-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, пСрСмСнная Ρ‚ΠΈΠΏΠ° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π² Π‘++ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½ΠΈΠΊΠ°ΠΊ Π½Π΅ инициализируСтся, поэтому ΠΏΡ€ΠΈ объявлСнии Π΅Π΅ Π½Π°Π΄ΠΎ Π»ΠΈΠ±ΠΎ сразу ΠΆΠ΅ Π·Π°ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΈΡ€ΠΎΠ²Π½ΡΡ‚ΡŒ ΠΊ nullptr, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π² дальнСйшСм ΠΌΠΎΠΆΠ½ΠΎ Π±Ρ‹Π»ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Π½ΠΈ Π½Π° Ρ‡Ρ‚ΠΎ Π½Π΅ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚.

Π£ Π‘++ Π΅ΡΡ‚ΡŒ нСприятная ΠΎΡΠΎΠ±Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ, ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊ Ρ‡Π»Π΅Π½ΠΎΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° различаСтся Π² зависимости ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΌΡ‹ Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΈΠ»ΠΈ Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±ΡŠΠ΅ΠΊΡ‚. ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ‚ΠΈΠΏΠ° "ΠΎΠ±ΡŠΠ΅ΠΊΡ‚" ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ происходит с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ символа ., Π° Ссли Ρ€Π°Π±ΠΎΡ‚Π° ΠΈΠ΄Π΅Ρ‚ с ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚, Ρ‚ΠΎ ΠΎΠ±Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ->. ΠŸΡ€ΠΈΠΌΠ΅Ρ€, Π½ΠΈΠΆΠ΅:

#include <iostream>

class Point {
  int x;
  int y;

public:

  void print(){
    std::cout << x << ":" << y << std::endl;
  }

  Point() {
    std::cout << "Creating point" << std::endl;
    x = 0;
    y = 0;
  }
};

int main() {
  Point *pPoint = nullptr;
  pPoint = new Point();

  pPoint->print();

  Point point;
  point.print();

  return 0;
}

Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ это ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Π΅, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡ€ΠΈΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ Π΄Ρ€ΡƒΠ³ Π΄Ρ€ΡƒΠ³Ρƒ ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ Π² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ.

13. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ ΠΈ дСструкторы

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½ для ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈ вызываСтся автомати­чСски ΠΏΡ€ΠΈ Π΅Π³ΠΎ создании. НиТС пСрСчислСны основныС свойства конструкторов.

  • ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ Π½Π΅ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, Π΄Π°ΠΆΠ΅ Ρ‚ΠΈΠΏΠ° void.
  • НСльзя ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ ΡƒΠΊΠ°Π·Π°Β­Ρ‚Π΅Π»ΡŒ Π½Π° конструктор.
  • Класс ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ нСсколько конструкторов с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ для Ρ€Π°Π·Π½Ρ‹Ρ… Π²ΠΈΠ΄ΠΎΠ² ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (ΠΏΡ€ΠΈ этом ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠ·ΠΊΠΈ).
  • ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€, Π²Ρ‹Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ², называСтся конструктором ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ.
  • ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Ρ‹ конструктора ΠΌΠΎΠ³ΡƒΡ‚ ΠΈΠΌΠ΅Ρ‚ΡŒ любой Ρ‚ΠΈΠΏ, ΠΊΡ€ΠΎΠΌΠ΅ этого ΠΆΠ΅ класса. МоТно Π·Π°Π΄Π°Π²Π°Ρ‚ΡŒ значСния ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π˜Ρ… ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· конструкторов.
  • Если программист Π½Π΅ ΡƒΠΊΠ°Π·Π°Π» Π½ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ конструктора, компилятор создаСт Π΅Π³ΠΎ автоматичСски. Π’Π°ΠΊΠΎΠΉ конструктор Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ конструкторы ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ для ΠΏΠΎΠ»Π΅ΠΉ класса ΠΈ конструкторы ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π±Π°Π·ΠΎΠ²Ρ‹Ρ… классов. Π’ случаС, ΠΊΠΎΠ³Π΄Π° класс содСрТит константы ΠΈΠ»ΠΈ ссылки, ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ создания ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° класса Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π΄Π°Π½Π° ошибка, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΈΡ… Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΌΠΈ значСниями, Π° конструктор ΠΏΠΎ-ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ этого Π΄Π΅Π»Π°Ρ‚ΡŒ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚.
  • ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ Π½Π΅ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ΡΡ.
  • ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ нСльзя ΠΎΠΏΠΈΡΡ‹Π²Π°Ρ‚ΡŒ с ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Π°ΠΌΠΈ const, virtual ΠΈ static.
  • ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π΄ΠΎ Π²Ρ‹Π·ΠΎΠ²Π° Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ main. Π›ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ становится Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΈΡ… дСйствия. ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ запускаСтся ΠΈ ΠΏΡ€ΠΈ создании Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠ³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‡Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π° ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ).

ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€ копирования β€” это ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π²ΠΈΠ΄ конструктора, ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽΡ‰ΠΈΠΉ Π² качСствС СдинствСнного ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ этого ΠΆΠ΅ класса: T::T(const Π’&) { ... /* Π’Π΅Π»ΠΎ конструктора V }, Π³Π΄Π΅ Π’ - имя класса.

ДСструктор - это особый Π²ΠΈΠ΄ ΠΌΠ΅Ρ‚ΠΎΠ΄Π°, ΠΏΡ€ΠΈΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉΡΡ для освобоТдСния памяти, Π·Π°Π½ΠΈΠΌΠ°Π΅ΠΌΠΎΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ. ДСструктор вызываСтся автоматичСски, ΠΊΠΎΠ³Π΄Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· области видимости:

  • для Π»ΠΎΠΊΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² - ΠΏΡ€ΠΈ Π²Ρ‹Ρ…ΠΎΠ΄Π΅ ΠΈΠ· Π±Π»ΠΎΠΊΠ°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Ρ‹;
  • для Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Ρ… - ΠΊΠ°ΠΊ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρ‹ Π²Ρ‹Ρ…ΠΎΠ΄Π° ΠΈΠ· main;
  • для ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ², Π·Π°Π΄Π°Π½Π½Ρ‹Ρ… Ρ‡Π΅Ρ€Π΅Π· ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ дСструктор вызываСтся ΠΏΡ€ΠΈ использовании ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ delete.

Если дСструктор явным ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ Π½Π΅ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½, компилятор автоматичСски созда­Ст пустой дСструктор.

Имя дСструктора начинаСтся с Ρ‚ΠΈΠ»ΡŒΠ΄Ρ‹ ~, нСпосрСдствСнно Π·Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ слСдуСт имя класса. ДСструктор:

  • Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅ΠΌΠΎΠ³ΠΎ значСния;
  • Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ объявлСн ΠΊΠ°ΠΊ const ΠΈΠ»ΠΈ static;
  • Π½Π΅ наслСдуСтся;
  • ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΌ

14. Π€Π°ΠΉΠ»Ρ‹: ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²Ρ‹ΠΉ Π²Π²ΠΎΠ΄-Π²Ρ‹Π²ΠΎΠ΄

Бтандартная Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° содСрТит Ρ‚Ρ€ΠΈ класса для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ: ifstream - класс Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²; ofstream - класс Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²; fstream - класс Π΄Π²ΡƒΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ².

Π­Ρ‚ΠΈ классы ΡΠ²Π»ΡΡŽΡ‚ΡΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄Π½Ρ‹ΠΌΠΈ ΠΎΡ‚ классов istream, ostream ΠΈ iostream соотвСтствСнно, поэтому ΠΎΠ½ΠΈ Π½Π°ΡΠ»Π΅Π΄ΡƒΡŽΡ‚ ΠΏΠ΅Ρ€Π΅Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ << ΠΈ >>, Ρ„Π»Π°Π³ΠΈ форматирования, манипуляторы, ΠΌΠ΅Ρ‚ΠΎΠ΄Ρ‹, состояниС ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈ Ρ‚. Π΄. ИспользованиС Ρ„Π°ΠΉΠ»ΠΎΠ² Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΏΡ€Π΅Π΄Π³ΡŽΠ»Π°Π³Π°Π΅Ρ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ:

  • созданиС ΠΏΠΎΡ‚ΠΎΠΊΠ°;
  • ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ° ΠΈ связываниС Π΅Π³ΠΎ с Ρ„Π°ΠΉΠ»ΠΎΠΌ;
  • ΠΎΠ±ΠΌΠ΅Π½ (Π²Π²ΠΎΠ΄/Π²Ρ‹Π²ΠΎΠ΄);
  • ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎΡ‚ΠΎΠΊΠ°;
  • Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°.

15. ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅/Π·Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ²

16. Π—Π°ΠΏΠΈΡΡŒ Π² Ρ„Π°ΠΉΠ»

17. Π§Ρ‚Π΅Π½ΠΈΠΉ ΠΈΠ· Ρ„Π°ΠΉΠ»Π°

ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ класс Ρ„Π°ΠΉΠ»ΠΎΠ²Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² содСрТит конструкторы, с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ этих
классов Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹ΠΌΠΈ способами.
- ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ Π±Π΅Π· ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса, Π½Π΅ связывая Π΅Π³ΠΎ с Ρ„Π°ΠΉΠ»ΠΎΠΌ: ifstream(); ofstream(); fstream(); - ΠšΠΎΠ½ΡΡ‚Ρ€ΡƒΠΊΡ‚ΠΎΡ€Ρ‹ с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°ΠΌΠΈ ΡΠΎΠ·Π΄Π°ΡŽΡ‚ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ класса, ΠΎΡ‚Β­ΠΊΡ€Ρ‹Π²Π°ΡŽΡ‚ Ρ„Π°ΠΉΠ» с ΡƒΠΊΠ°Π·Π°Π³Π½Ρ…Ρ‹ΠΌ ΠΈΠΌΠ΅Π½Π΅ΠΌ
ΠΈ ΡΠ²ΡΠ·Ρ‹Π²Π°ΡŽΡ‚ Ρ„Π°ΠΉΠ» с ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠΌ: ifstream(const char *name, ios_base::openmode mode = ios_base::in); ofstream(const char *name, ios_base::openmode mode = ios_base::out | ios_base::trunc); fstream(const char *name, ios_base::openmode mode = ios_base::in | ios_base::out); Π’Ρ‚ΠΎΡ€Ρ‹ΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ конструктора являСтся Ρ€Π΅ΠΆΠΈΠΌ открытия Ρ„Π°ΠΉΠ»Π°.

Π’Π°ΠΊ ΠΆΠ΅ для открытия Ρ„Π°ΠΉΠ»Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ open(), которая Π΅ΡΡ‚ΡŒ Ρƒ ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ². Выглядят ΠΎΠ½ΠΈ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ конструкторам: void open (const char* filename, ios_base::openmode mode = ios_base::in); void open (const string& filename, ios_base::openmode mode = ios_base::in);

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

Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»ΠΎΠ² осущСствляСтся ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ close() Ρƒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΡƒΠ΅Π³ΠΎ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°.

#include <iostream>
#include <fstream>

int main() {
    char text[81], buf[81];
    std::cout << "Π’Π²Π΅Π΄ΠΈΡ‚Π΅  имя  Ρ„Π°ΠΉΠ»Π°:";
    std::cin >> text;

    // ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ конструктора
    std::ifstream f(text, std::ios_base::in);
    if (!f.is_open()) {
        std::cout << "Ошибка  открытия Ρ„Π°ΠΉΠ»Π°";
        return 1;
    }
    while (!f.eof()) {
        // Π§ΠΈΡ‚Π°Π΅ΠΌ построчно ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ getline()
        f.getline(buf, 81);
        std::cout << buf << std::endl;
    }
    // Π—Π°ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ Ρ„Π°ΠΉΠ»Π°
    f.close();

    // ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠ΅Ρ‚ΠΎΠ΄Π° open
    f.open(text, std::ios_base::in);
    if (!f.is_open()) {
        std::cout << "Ошибка  открытия Ρ„Π°ΠΉΠ»Π°";
        return 1;
    }
    while (!f.eof()) {
        // Π§ΠΈΡ‚Π°Π΅ΠΌ ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ извлСчСния
        f >> buf;
        std::cout << buf << std::endl;
    }
    f.close();

    return 0;
}

18. ΠŸΡ€ΡΠΌΠΎΠΉ доступ ΠΏΡ€ΠΈ использовании Ρ„Π°ΠΉΠ»ΠΎΠ²

???

19. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Π²ΠΈΠ΄ списков - ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ, использованиС ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

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

20. Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΎΠ³ΠΎ списка: элСмСнт списка(описаниС с использованиСм

структуры/класса), ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт

ΠŸΡ€ΠΎΡΡ‚Π΅ΠΉΡˆΠΈΠΉ элСмСнт ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ списка:

struct Node
{ 
    int  d;    // Π΄Π°Π½Π½Ρ‹Π΅  
    Node *Ρ€;   // Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт
}

Π—Π΄Π΅ΡΡŒ Π² качСствС Π΄Π°Π½Π½Ρ‹Ρ…, хранящихся Π² элСмСнтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ int d. Node *p ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° слСдущий элСмСнт списка. ΠžΠ±Ρ‹Ρ‡Π½ΠΎ Π² ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ΅ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт списка, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: struct Node *head. Благодаря этому ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° всСгда Π·Π½Π°Π΅Ρ‚ с ΠΊΠ°ΠΊΠΎΠ³ΠΎ элСмСнта Π½Π°Ρ‡ΠΈΠ½Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ сканировании списка. Π£ послСднСго элСмСнта ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт, Ρ…ΠΎΡ‚ΡŒ ΠΈ присутствуСт, Ρ€Π°Π²Π΅Π½ nullptr. ΠŸΡ€ΠΈ сканировании это ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° послСдний элСмСнт.

#include <iostream>

struct Node
{
    int  d;    // Π΄Π°Π½Π½Ρ‹Π΅
    Node *next;   // Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт
};

int main() {

    Node *head = nullptr; // Пока Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅Ρ‚. Бписок пуст
    head = new Node; // Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ структуру
    head->d = 1; // Π—Π°Π΄Π°Π΄ΠΈΠΌ Π½Π΅ΠΊΡƒΡŽ ΠΏΠΎΠ»Π΅Π·Π½ΡƒΡŽ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ
    head->next = nullptr; // Π‘Π»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт null, Ρ‚.ΠΊ. большС Π² спискС Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅Ρ‚
    // Π’Π΅ΠΏΠ΅Ρ€ΡŒ head ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт списка. Он ΠΆΠ΅ ΠΈ послСдний.

    Node *e = head; // ΠŸΠΎΠ΄Π³ΠΎΡ‚ΠΎΠ²ΠΊΠ° ΠΊ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡŽ. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΡƒΡŽ Π½Π° Π½Π°Ρ‡Π°Π»ΠΎ списка.

    while(e != nullptr) { // сканируСм Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° элСмСнт списка Π½Π΅ nullptr
        std::cout << e->d << std::endl;
        e = e->next; // ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΠΌ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ e, Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт.
    }

    return 0;
}

21. Π‘Π°Π·ΠΎΠ²Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ списком: созданиС пустого списка, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ всСго списка

22. ΠŸΡ€ΠΎΡΡ‚ΠΎΠΉ Π²ΠΈΠ΄ списков - ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΉ, Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΉ, использованиС формуляра ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΉ

23. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ списком: вставка элСмСнта(Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹)

24. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΎΠ΄Π½ΠΎΠ½Π°ΠΏΡ€Π°Π²Π»Π΅Π½Π½Ρ‹ΠΌ Π»ΠΈΠ½Π΅ΠΉΠ½Ρ‹ΠΌ списком: ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта(Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹)

#include <iostream>

struct Node
{
    int  d;    // Π΄Π°Π½Π½Ρ‹Π΅
    Node *next;   // Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт
};

struct List { // Π‘Ρ‚Ρ€ΡƒΠΊΡ‚ΡƒΡ€Π° для списка
    Node *head; // Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт списка. nullptr Ссли список пуст
    Node *tail; // Π£ΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° послСдний элСмСнт списка. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для быстрого добавлСния Π² ΠΊΠΎΠ½Π΅Ρ†.
};

// Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ пустого списка
List *create_list() {
    List *result = new List; // Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° структуру списка
    result->head = nullptr; // ПокаТСм, Ρ‡Ρ‚ΠΎ ΠΎΠ½ пустой
    return result;
}

// Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ элСмСнта Π² списк
void add_node(List *list, int data) {
    Node *newNode = new Node;
    newNode->d = data;
    newNode->next = nullptr;
    if(list->head == nullptr) { // Бписок пустой
        list->head = newNode; // Новый элСмСнт Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ
    } else {
        list->tail->next = newNode; // Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΌ послСднСм элСмСнтС списка ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ послСдний - Π²Π½ΠΎΠ²ΡŒΡΠΎΠ·Π΄Π°Π½Ρ‹ΠΉ.
    }
    list->tail = newNode; // ΠŸΡ€ΠΈΡΠ²Π°ΠΈΠ²Π°Π΅ΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½ΠΎΠ²Ρ‹ΠΉ элСмСнт сохранСнному Π² структурС списка.
}

// Π£Π΄Π°Π»Π΅Π½ΠΈΠ΅ элСмСнта ΠΈΠ· списка
void del_node(List *list, Node *node) {
    if( node == list->head ) { // Наш элСмСнт оказался ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ Π² спискС
        list->head = node->next; // Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ стал слСдущий элСмСнт.
        delete node; // Π£Π΄Π°Π»ΠΈΠ»ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ ΠΏΠΎ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŽ node
        return;
    }
    // ΠŸΡ€ΠΈΠ΄Π΅Ρ‚ΡΡ ΠΏΡ€ΠΎΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ вСсь список Π² поисках Π½ΡƒΠΆΠ½ΠΎΠ³ΠΎ элСмСнта
    Node *e; // Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ
    e = list->head; // ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΠΌ Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт списка
    while(e->next != node) { // ΠŸΠ΅Ρ€Π΅ΠΌΠ΅Ρ‰Π°Π΅ΠΌΡΡ ΠΏΠΎ списку ΠΏΠΎΠΊΠ° ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π½Π° наш
        e = e->next;  // ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт
    }
    // Если ΠΆΠ΅Π»Π°Π΅ΠΌΡ‹ΠΉ элСмСнт послСдний, Π½Π°Π΄ΠΎ ΠΏΡ€ΠΈΡΠΎΠ²ΠΈΡ‚ΡŒ tail Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ прСдпослСднСго ΡƒΠ·Π»Π°
    if(node == list->tail) {
       list->tail = e;
    }
    // Π’ элСмСнтС для ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт искомый Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт Π½Π°
    // элСмСнт, ΡΠ²Π»ΡΡŽΡ‰ΠΈΠΉΡΡ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ для искомого(Π΄ΠΎ этого этот ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π» Π½Π° искомый элСмСнт
    e->next = node->next;
    delete node; // БобствСнно ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
}

// Поиск ΡƒΠ·Π»Π°, с Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΌΠΈ Π΄Π°Π½Π½Ρ‹ΠΌΠΈ
Node *find_node(List *list, int value) {
    Node *e = list->head; // Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ присвоим Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ указатСля Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт
    while(e != nullptr) { // Π‘ΡƒΠ΄Π΅ΠΌ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΊΠ° элСмСнт Π½Π΅ nullptr
        if( e->d == value) { // Если Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ элСмСнта Ρ€Π°Π²Π½ΠΎ искомому - ΠΏΡ€Π΅Ρ€Ρ‹Π²Π°Π΅ΠΌ сканированиС
            break;
        }
        e = e->next; // ΠŸΡ€ΠΈΡΠ²ΠΎΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ элСмСнта ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ
    }
    // Если Π²Ρ‹Ρ…ΠΎΠ΄ ΠΈΠ· Ρ†ΠΈΠΊΠ»Π° ΠΏΡ€ΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ ΠΏΠΎ if(e->d==value) - Π·Π½Π°Ρ‡ΠΈΡ‚ ΠΌΡ‹ нашли Π½ΡƒΠΆΠ½Ρ‹ΠΉ элСмСнт ΠΈ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Π½Π΅Π³ΠΎ
    // находится Π² e.
    // Если искомый элСмСнт Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ e Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ nullptr. Π­Ρ‚ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ способ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, Ρ‡Ρ‚ΠΎ элСмСнта Π½Π΅Ρ‚
    return e;
}

// РаспСчатаСм элСмСнты списка
void print_list(List *list) {
    Node *e = list->head;
    do {
        std::cout << e->d << " ";
        e = e->next;
    } while(e!= nullptr);
    std::cout << std::endl;
}

void destroy_list(List *list) {
    Node *e = list->head; // Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΡƒΡŽ ΠΈ присвоСм Π΅ΠΉ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ элСмСнт списка
    do { // Π‘ΠΊΠ°Π½ΠΈΡ€ΡƒΠ΅ΠΌ Π΄ΠΎ Ρ‚Π΅Ρ… ΠΏΠΎΡ€, ΠΏΠΎΠΊΠ° e Π½Π΅ послСдний элСмСнт
        Node *node_to_del = e; // Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠΉ элСмСнт Π² node_to_del
        e = e->next;        // Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΠΌ Π² e ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ элСмСнт
        delete node_to_del; // Π£Π΄Π°Π»ΠΈΠΌ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚
    } while(e != nullptr);
    delete list; // Освободим ΠΏΠ°ΠΌΡΡ‚ΡŒ, Π²Ρ‹Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ ΠΏΠΎΠ΄ структуру списка
}

int main() {

    List *list = create_list(); // Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ структуру для списка

    add_node(list, 1); // ДобавляСм элСмСнт со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1
    add_node(list, 2); // 2
    add_node(list, 3); // 3
    add_node(list, 4); // 4
    add_node(list, 5); // 5
    print_list(list);

    Node *n = find_node(list, 8); // НайдСм ΡƒΠ·Π΅Π» со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 8
    if(n != nullptr) { // Если ΠΈΠ· Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²Π΅Ρ€Π½ΡƒΠ»ΠΎΡΡŒ nullptr, Π·Π½Π°Ρ‡ΠΈΡ‚ ΡƒΠ·Π΅Π» Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½. Π•Π³ΠΎ Ρ‚Π°ΠΌ Π½Π΅Ρ‚, ΠΌΡ‹ Π΅Π³ΠΎ Π½Π΅ создавали.
        del_node(list, n);
    }
    print_list(list);

    n = find_node(list, 4); // НайдСм ΡƒΠ·Π΅Π» со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 4
    if(n != nullptr) {  // Π’ этот Ρ€Π°Π· найдСтся ΠΈ Π² n, Π±ΡƒΠ΄Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ Π½Π° искомый элСмСнт
        del_node(list, n); // Π£Π΄Π°Π»ΠΈΠΌ этот элСмСнт ΠΈΠ· списка
    }
    print_list(list);

    n = find_node(list, 1); // НайдСм ΡƒΠ·Π΅Π» со Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ΠΌ 1
    if(n != nullptr) { // Он Ρ‚ΡƒΡ‚ Π΅ΡΡ‚ΡŒ. И ΠΌΡ‹ ΠΏΡ€Π°Π²Π΅Ρ€ΠΈΠΌ, ΠΊΠ°ΠΊ Ρƒ нас удаляСтся "Π³ΠΎΠ»ΠΎΠ²Π½ΠΎΠΉ" элСмСнт
        del_node(list, n); // УдаляСтся, ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΊΠ°ΠΊ ΠΈ любой Π΄Ρ€ΡƒΠ³ΠΎΠΉ. Π’Π΅ΠΏΠ΅Ρ€ΡŒ "Π³ΠΎΠ»ΠΎΠ²Π°" списка ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° элСмСнт 2
    }
    print_list(list);

    n = find_node(list, 5); // ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ Ссли ΠΌΡ‹ Π·Π°Ρ…ΠΎΡ‚ΠΈΠΌ ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ послСдний элСмСнт
    if(n != nullptr) {
        del_node(list, n); // ΠœΡ‹ это прСдусмотрСли, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ всС Π±ΡƒΠ΄Π΅Ρ‚ Π² порядкС
    }
    print_list(list);

    add_node(list, 88); // На всякий случай Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΊΠΎΠ½Ρ†Π΅ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ элСмСнт
    print_list(list);

    destroy_list(list); // УбьСм остатки списка
    print_list(list); // Ай Π°ΠΉ Π°ΠΉ, Π½Π΅ Π½Π°Π΄ΠΎ Ρ‚Π°ΠΊ. Бписка ΡƒΠΆΠ΅ Π½Π΅Ρ‚Πͺ. Π’Ρ‹Π²Π΅Π΄Π΅Ρ‚ мусор ΠΈΠ»ΠΈ ΡƒΠΏΠ°Π΄Π΅Ρ‚
    return 0;
}

25. Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° тСкстовой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ: прСдставлСниС строки с ΠΌΠ°Ρ€ΠΊΠ΅Ρ€ΠΎΠΌ

26. Π₯Ρ€Π°Π½Π΅Π½ΠΈΠ΅ ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° тСкстовой ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ: использованиС списка для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Π½Π°Π±ΠΎΡ€ΠΎΠΌ строк

27. Π€Π°ΠΊΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΈΠ²Π½ΠΎ: Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΡΠΈΠΌΠ²ΠΎΠ»ΡŒΠ½Ρ‹Ρ… строк.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published