Програмування С, С++теорія та практика (частина 2)
2.10.2 Операції поміщення та вилучення
Бібліотека класів С++ передбачає два основних класи для введення та виведення: відповідно іхґгеат та охґгеат. Потокові оператори застосовуються наступним чином:
об'єкт_потоку_вводу >> змінна;
об'єкт_потоку_виводу << змінна;
Примітка. Ці оператори не слід плутати з відомими побітовими операторами зсуву вліво та вправо. Образно кажучи, в розглядуваному контексті перевантажені оператори >> та << однозначно ясно вказують напрямок потоку даних від одного об'єкта до іншого.
Потік соиґ (скагасґег оиґ) - стандартний символьний вихідний потік, що по замовчування відповідає пристрою виведення (дисплей). Клас озігеат використовує для виведення перевантажену операцію лівого зсуву (<<). Якщо ця операція застосовується об’єктом-потоком, вона носить ім'я операції поміщення у потік (ітегґіоп орегаґіоп). Наступний приклад друкує рядок, застосовуючи операцію поміщення до визначеного об’єкту соиґ.
#іпс1ийе<іоз'Ьгеат.Ь> іп£ таіп^оій.)
{
сои'Ь << "Не11о!"; ге'Ьигп 0;
}
Проаналізуємо, як відпрацює такий фрагмент. По-перше, С++ визначить, що в даній операції << лівий аргумент соиґ має тип озігеат, а правий - скаг*. За цими даними у заголовочному файлі буде знайдений відповідний прототип функції - о$ґгеат& орегаґог<<(о$ґгеат&, скаг*). Після цього буде згенерований виклик функції поміщення у потік орегаґог<< з рядком ‘Неііо!’ та екземпляром соиґ в якості параметрів. іншими словами, здійснюватиметься виклик стандартної бібліотечної функції орегаґог<<(соиґ, ‘Неііо! ’), як того у даному випадку вимагає прототип.
Аналогом в традиційному Сі потоку соиґ відповідає функція /ргіпґ/() та ім'я пристрою виведення зґйоиґ. Розглянемо простий приклад, що застосовує у двох варіантах відповідно ргіпґ/() (це тільки скорочена форма/ргіпґ/(іі^оиґ, ...)) та об'єкт соиґ.
1 варіант йоиЬ1е пит=2.35;
ргіп^£ ("зЬом 1 : % 1гі \п", пит) ;
// непередбачене "сміття" на виході !
2 варіант
йоиЬ1е пит=2.35; сои^<<"зЬом 2="<<пит<<"\п";
// а тут все буде правильно
Саме тут і впадає в очі перевага потоків. Символи % ІС в першому варіанті повідомляють про те, що змінна пит відноситься до типу Іопд. У наступному рядку при активації функції виявляється невідповідність типів, і ргіпґ/() мовчки виконує неправильне виведення. Застосовуючи у другому варіанті об'єкт-потік, подібна помилка просто виключена - інформація про тип автоматично надходить безпосередньо від самого об'єкту соиґ.
Потік сіп (скагасґвг іп) - стандартний символьний потік введення, що по замовчування відповідає клавіатурі. Клас ізґгеат використовує для введення перевантажену операцію правого зсуву (>>). У розглядуваному контексті її називають операцією вилучення з потоку (ехґгасґіоп орегаґіоп). Аналогом цього потоку в Сі відповідає функція /зсап/() та ім'я пристрою зґСіп. Наступний приклад застосовує операцію вилучення зі стандартного потоку для визначеного об’єкту сіп, аби прочитати рядок з клавіатури:
#іпс1игіе<іоз'Ьгеат.Ь> іп£ таіп^оігі.)
{
сЬаг пате [100];
сои£ << " Введіть ваше ім'я: ";
сіп >> пате;
сои£ << " Привіт, ";
сои£ << пате;
ге'Ьигп 0;
}
Класи ізґгеат та озґгеат перевантажують відповідно >> та << для усіх вбудованих типів даних. Таке перевантаження дозволяє використовувати однаковий синтаксис для роботи зі змінними різних типів. Наступний приклад ілюструє тотожність синтаксису в такій ситуації:
#іпс1ийе <іоз'Ьгеат.Ь> іп£ таіп ^оій)
{
сЬаг с = 'А' ; зідпей сЬаг зс = 'В' ; ипзідпей сЬаг ис = 'С' ; іп£ і = 0хй;
£1оа£ £ = 1.7; йоиЬ1е й = 2.8;
|
сои£ |
<< |
с; |
// |
Викликає |
орегагог |
<< |
(сЬаг) |
|
сои£ |
<< |
зс; |
// |
Викликає |
орегагог |
<< |
(зідпей сЬаг) |
|
сои£ |
<< |
ис; |
// |
Викликає |
орегагог |
<< |
(ипзідпей сЬаг) |
|
сои£ |
<< |
і; |
// |
Викликає |
орегагог |
<< |
(іп£) |
|
сои£ |
<< |
£; |
// |
Викликає |
орегагог |
<< |
(£1оа£) |
|
сои£ |
<< |
й; |
// |
Викликає |
орегагог |
<< |
(йоиЬ1е) |
|
ге'Ьигп 0 ; |
}
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
