Головна

інкапсуляція

  1.  Спадкування, Поліморфізм, Інкапсуляція

Це механізм дозволяє об'єднати дані з функціями (методами), маніпулюють цими даними, і захистити і те й інше від зовнішнього втручання або неправильного використання. Дані та методи впливу на них стають частиною одного об'єкта, який отримав назву клас.

Дані всередині об'єкта можуть бути відкритими (public) Або закритими (private). Закриті елементи об'єкта недоступні для тих частин програми, які існують поза об'єктом, тобто доступні для елементів цього об'єкта. Якщо ж елементи об'єкта є відкритими, то вони стають доступними для всієї програми

Іншими словами, об'єкт є змінною типу, визначеного користувачем (найпростіший приклад - структури).

Як приклад створимо клас, що дозволяє працювати з рядком символів. Набір даних, що описують цей об'єкт повинен складатися:

O власне рядки;

O позиції на екрані, з якою буде виводитися рядок;

O відеоатрібутов символів (колір тексту і фону).

Набір методів для роботи з рядком може бути наступним:

O введення рядка;

O встановлення координат для подальшого виведення рядка;

O установка відеоатрібутов символів;

O висновок рядка в вказане місце.

#include "conio.h"

#include "stdio.h"

class String {char str [80]; // Закриті члени-класу

 int attr;

 int row, col;

 public: void setAttr (int a) {attr = a; } // Відкриті члени-класу

 void setStr (char * s) {strcpy (str, s); }

 void setCoord (int x, int y) {row = y; col = x; }

 void printStr (int = 0, int = 0); // Аргументи за умовчанням

 };

inline void String :: printStr (int x, int y)

{Textattr (attr);

 gotoxy (x == 0? coll: x, y == 0? row: y);

 cputs (str);

}

main ()

{String Str, * sp = & Str;

 Str.setAttr ((BLUE << 4) + YELLOW); // Пишемо жовтим по синьому

 Str.setStr ( "HELLO, U S E R !!!");

 sp-> printStr (5,20);

}

Перевантаження операцій і функцій (поліморфізм)

В С ++ операції (зі списку вже існуючих) можуть бути визначені для об'єктів, визначених користувачем. Це зручно, тому що, наприклад, описавши клас «вектор в тривимірному просторі», не потрібно придумувати ім'я функції для виконання операції додавання векторів, а можна перевизначити сенс наявної операції + таким чином, що складання двох векторів буде записуватися у звичній для нас формі: А + В. В даному випадку мова буде йти про перевантаження операторів.

Перевантаження можлива і для функцій. Транслятор в змозі розрізнити функції не тільки по іменах, а й за типами аргументів. Тому допустимим вважається наявність двох функцій з одним ідентифікатором, що розрізняються тільки типом аргументів. наприклад,

 int sqr (int x) {return x * x; }

 float sqr (float x) {return x * x; }

Код, який конкретно функції буде використаний при виклику - залежить від типу фактичного аргументу. Перевантажені функції добре використовувати при введенні нових типів даних. Скажімо, описавши тип COMPLEX для роботи з комплексними числами, можна скласти функцію pow () для зведення в ступінь комплексного числа, а назвати її можна так само, як і функцію, що працює з числами.

Як приклад перевизначити операцію + так, щоб можна було об'єднувати символьні рядки.

#include "conio.h"

#include "stdio.h"

#define LEN 80

struct String {public: char str [LEN];

 int len;

 };

String operator + (String S1, String S2)

{String Temp;

 if ((Temp.len = S1.len + S2.len)> = LEN)

 {Temp.s [0] = '\ 0';

 Temp.len = 0;

}

 else

 {Strcpy (Temp.s, S1.s);

 strcpy (Temp.s, S2.s);

}

 return Temp;

}

}

main ()

{String S1, S2, S3;

 strcpy (S1.s, "Перевантаження операцій -");

 S1.len = strlen (S1.s);

 strcpy (S2.s, "класна річ!");

 S2.len = strlen (S2.s);

 printf ( "Були рядки: \ n% s \ n% s \ n з довжинами% d і% d \ n", S1.s, S2.s, S1.len, S2.len);

 S3 = S1 + S2;

 printf ( "Вийшла рядок: \ n \ t% s довжиною% d \ n", S3.s, S3.len);

}



 Int fseek (FILE * stream, long offset, int origin). |  спадкування

 структури |  Імя_структури. імя_елемента |  Структури і функції |  динамічні структури |  Структура пов'язаного двонаправленого списку |  МАНІПУЛЯТОРИ ВВЕДЕННЯ-ВИВЕДЕННЯ |  ФУНКЦІЇ ВСТАВКИ І ВИЛУЧЕННЯ |  ОСНОВИ файлового вводу-виводу |  Неформатіруемий двійковий введення / виведення |  Додаткову інформацію про функції двійкового введення / виведення |

© um.co.ua - учбові матеріали та реферати