Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Инкапсуляция



Это механизм позволяет объединить данные с функциями (методами), манипулирующими этими данными, и защитить и то и другое от внешнего вмешательства или неправильного использования. Данные и методы воздействия на них становятся частью одного объекта, который получил название класс.

Данные внутри объекта могут быть открытыми (public) или закрытыми (private). Закрытые элементы объекта недоступны для тех частей программы, которые существуют вне объекта, т.е. доступны для элементов этого объекта. Если же элементы объекта являются открытыми, то они становятся доступными для всей программы

Иными словами, объект является переменной типа, определенного пользователем (простейший пример - структуры).

В качестве примера создадим класс, позволяющий работать со строкой символов. Набор данных, описывающих этот объект должен состоять:

Ø собственно строки;

Ø позиции на экране, с которой будет выводиться строка;

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

Набор методов для работы со строкой может быть следующим:

Ø ввод строки;

Ø установка координат для дальнейшего вывода строки;

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

Ø вывод строки в указанное место.

#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);

}





Дата публикования: 2015-02-22; Прочитано: 209 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...