Студопедия
Новини освіти і науки:
МАРК РЕГНЕРУС ДОСЛІДЖЕННЯ: Наскільки відрізняються діти, які виросли в одностатевих союзах


РЕЗОЛЮЦІЯ: Громадського обговорення навчальної програми статевого виховання


ЧОМУ ФОНД ОЛЕНИ ПІНЧУК І МОЗ УКРАЇНИ ПРОПАГУЮТЬ "СЕКСУАЛЬНІ УРОКИ"


ЕКЗИСТЕНЦІЙНО-ПСИХОЛОГІЧНІ ОСНОВИ ПОРУШЕННЯ СТАТЕВОЇ ІДЕНТИЧНОСТІ ПІДЛІТКІВ


Батьківський, громадянський рух в Україні закликає МОН зупинити тотальну сексуалізацію дітей і підлітків


Відкрите звернення Міністру освіти й науки України - Гриневич Лілії Михайлівні


Представництво українського жіноцтва в ООН: низький рівень культури спілкування в соціальних мережах


Гендерна антидискримінаційна експертиза може зробити нас моральними рабами


ЛІВИЙ МАРКСИЗМ У НОВИХ ПІДРУЧНИКАХ ДЛЯ ШКОЛЯРІВ


ВІДКРИТА ЗАЯВА на підтримку позиції Ганни Турчинової та права кожної людини на свободу думки, світогляду та вираження поглядів



Контакти
 


Тлумачний словник
Авто
Автоматизація
Архітектура
Астрономія
Аудит
Біологія
Будівництво
Бухгалтерія
Винахідництво
Виробництво
Військова справа
Генетика
Географія
Геологія
Господарство
Держава
Дім
Екологія
Економетрика
Економіка
Електроніка
Журналістика та ЗМІ
Зв'язок
Іноземні мови
Інформатика
Історія
Комп'ютери
Креслення
Кулінарія
Культура
Лексикологія
Література
Логіка
Маркетинг
Математика
Машинобудування
Медицина
Менеджмент
Метали і Зварювання
Механіка
Мистецтво
Музика
Населення
Освіта
Охорона безпеки життя
Охорона Праці
Педагогіка
Політика
Право
Програмування
Промисловість
Психологія
Радіо
Регилия
Соціологія
Спорт
Стандартизація
Технології
Торгівля
Туризм
Фізика
Фізіологія
Філософія
Фінанси
Хімія
Юриспунденкция






Перевизначення операції присвоєння

Така операція використовується для присвоєння значення одного об‘єкту даного класу іншому.

class Cat

{

public:

int GetAge();

int GetW ();

Cat & operator= (Cat &);

private:

int *Age;

int *W;

};

Cat & Cat :: operator= (Cat &h)

{

*Age = h.GetAge();// присвоєння одних змінних іншим

*W = h.GetW();

return *this; //повернення вказівника об‘єкту

}

 

int main()

{ Cat Frisky;

Cat Whiskers;

Whiskers=Frisky; // присвоєння одного об‘єкту іншому

return 0;

}

Зверніть увагу на використання посилкових типів в операції =. Перевизначена операція присвоєння не наслідується. Якщо для будь-якого класу Х нема введеної користувачем операції = , то по замовчуванню операція = визначається як поелементне присвоєння для всіх членів класу.

 

Перевизначення операції ->

Доступ до члену класу розглядається як унарна операція. Вираз x-m, де х є об‘єкт класу Х інтерпретується як (x.operator->( )) –m, так що функція operator->( ) має повертати вказівник на об‘єкт класу. Має бути визначена як нестатична функція-член класу.

 

Загальні правила перевизначення.

1. С++ не розрізняє перевизначені префіксні та постфіксні версії ++ та --.

2. Операція, яка перевизначається, має існувати в мові. Наприклад, неможна визначати оператор #.

3. Неможна перевизначити наступні операції: . :: ? :

4. Пріоритет операцій при перевизначенні зберігається.

5. Не можно змінити число операндів операції, тобто унарна для 1-го операнду, бінарна для 2-х.

Дружні функції

Дружньою функцією класу називається функція, яка сама не є членом класу, але має повні права на доступ до закритих та захищених елементів класу. Оскільки така функція не є членом класу, то вона не може бути вибрана з допомогою операторів (.) та (->), Дружня функція класу викликається звичайним способом. Для опису дружньої функції використовується ключове слово friend. Наприклад,

class X

{

int i;

friend void F( X *, int);

public:

void M (int);

};

void F(X *px, int a)

{ px ->i=a;} //доступ до закритого елемента через вказівник об‘єкту

void X ::M(int a)

{i=a;} //прямий доступ до закритого елемента

 

int main( )

{ X mm;

F(&mm, 6);//виклик фружньої функції

mm.M(6);//виклик методу класу

}

 

З допомогою опису friend ім‘я класу можна оголосити всі функції класу дружніми для іншого класу:

 

class Y

{

void f1(X &);

void f2(X *);

};

class X

{

friend Y;

int i;

int M( int);

};

Функції можуть бути дружніми більш ніж одному класу.

Також можна оголосити деякі окремі функції-члени класу дружніми для іншого класу:

class X

{...

void f1(int);

...};

class Y

{

int i;

friend void X::f1(int);

};

 

Відношення дружності не є транзитивним: Х дружній Y, Y дружній Z, але не обов‘язково Х дружній Z.

Лекція 8

ПОТОКИ

С++ підтримує стандартну бібліотеку iostream, яка повністю відповідає за ввід та вивід даних. Перенос обробки операцій вводу-виводу в спеціальні бібліотеки дозволив отримати ефект незалежності від платформи. Це дозволяє створити програму на С++ для комп‘ютерів РС, а потім відкомпілювати її для робочої станції SUN. Класи iostreamрозглядають інформацію як побітовий потік даних. Якщо дані виводяться у файл або на екран, джерело потоку включено в програму. Якщо потік направлений в протилежну сторону, то дані поступають з клавіатури або файлу у змінні. Головна задача потоків – інкапсуляція процедури обміну інформацією з диском або дисплеєм комп‘ютера.

Запис на диск та вивід на екран потребують багато часу, що призводить до блокування виконання програми. Для вирішення цієї проблеми потоки підтримують буферизацію. Спочатку дані записуються у буфер потоку, а після його наповнення уся інформація разом записується на диск.

Реалізація потоків та буферів відбувається засобами об‘єктно-орієнтованого підходу С++:

- клас streambufкерує буфером, наповнює його, очищує та скидає;

- клас iosє базовим для класів потоків вводу-виводу. В якості змінної класу iosє об‘єкт streambuf;

- кккласи istreamтаostreamє похідними від класу iosта відповідають відповідно за потоковий ввід та вивід даних;

- клас iosteamє похідним від класів istreamтаostreamі забезпечує функції вводу з клавіатури та виводу на екран;

- клас fstreamвикористовується для операцій вводу-виводу з файлів.

При запуску програми, що включає клас iostreamстворюються 4 об‘єкти:

1) об‘єкт CIN – обробляє ввід з клавіатури;

2) об‘єкт COUT – обробляє вивід на екран;

3) об‘єкт CERR – обробляє вивід повідомлень про помилки на екран;

4) об‘єкт CLOG – обробляє пере адресацію повідомлень про помилки у файл регістрації.

Ввід даних через об‘єкт CIN

 

Об‘єкт CIN включає перевантажений оператор вводу >>, який записує дані з буфера в локальну змінну.

int a;

cin >> a;

Оператор вводу перевантажений так, що підходить для вводу даних всіх основних типів int, short, long, char, float, double. Коли компілятор зустрічає вираз cin >> a; то запускається той варіант вводу, який відповідає типу змінної а. Для попереднього прикладу це буде варіант перевантаженого оператора вводу для цілого типу

istream & operator >> (int &)

Приклад:

#include <iostream>

void main()

{ int myInt;

float myFloat;

cin>> myInt;

cin >> myFloat;

}

Об‘єкт CIN може приймати аргументом вказівник на стрічку символів. Але при цьому пробіл сприймається як роздільник стрічок і при зустрічі пробілу cin завершує ввід, додає кінцевий нульовий символ.

 

char YourName[50];

cin >> YourName;

Функції об‘єкту CIN

 

1. Функція get() служить для зчитування одного символу зі стандартного пристрою вводу. Цей символ потоку вводу присвоюється символьній змінній, що передається функції get() як параметр.

 

char a;

cin.get(a);

Для вводу символьного масиву необхідно вказати в параметрах функції get() ім‘я масиву та максимальну кількість символів з врахуванням кінцевого нульового символу.

 

char Mas[256];

cin.get(Mas, 256);

 

2. Функція ignore() ігнорує частину символів до кінця стрічки або до кінця файлу. Вона приймає два параметри – кількість символів, що пропускається та символ закінчення.

 

ignore(80, ‘\n’);

 

Програма пропустить ввід 80 символів, якщо раніше не зустріне символ нової стрічки. Він також видаляється з буферу і функція завершує роботу.

 

3. Функція peek() проглядає але не вводить один символ з буфера.

4. Функція putback() вставляє один символ в потік вводу.

Приклад, замінити всі знаки оклику при вводі знаком долара і видалити всі знаки решітка.

#include <iostream>

void main()

{ char ch;

while (cin.get(ch))

{ if (ch ==’!’)

cin.putback(‘$’); // не вводити ! а вводити $

else cout << ch;

while ( cin.peek() ==’#’)

cin.ignore(1, ‘#’); // пропустити знак #

} }

 

Вивід даних через об‘єкт COUT

Об‘єкт COUT дозволяє форматувати дані, виводити на екран стрічки, числа, вирівнювати стовбці, виводити числові значення в десятковому та шіснадцятковому форматі. Перед виводом даних рекомендується провести очистку буфера. Це робить функція flush() об‘єкту COUT.

cout << flush();

 

Функції об‘єкту COUT

 

1. Функція put() виводить окремі символи.

 

cout.put(‘Y’);

 

2. Функція write() працює так само, як оператор вводу << , але вона приймає параметр, що вказує максимальну кількість символів при виводі.

 

char Mas[ ] = “ab c def”;

int len=strlen(Mas); // 8

int s=len-4; // 4

cout.write(Mas, len) << “\n”; // ab c def

cout.write(Mas,s) << ”\n”; // ab c

 

3. За замовчуванням ширина поля виводу автоматично встановлюється так, щоб вмістити всі символи стрічки з буфера виводу. Але з допомогою функції width() можна встановити точне значення ширини поля виводу. Ця функція є членом об‘єкту COUT.

 

cout.width(4);

cout << 12;//_ _ 12

 

4. Щоб заповнити пусті позиції певним символом , на приклад, «*» використовують функцію fill(), в параметрі якої вказують символ заповнення.

 

cout.fill(‘*’);

 




Переглядів: 1177

Не знайшли потрібну інформацію? Скористайтесь пошуком google:

 

© studopedia.com.ua При використанні або копіюванні матеріалів пряме посилання на сайт обов'язкове.


Генерація сторінки за: 0.007 сек.