Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Языки программирования.docx
Скачиваний:
3
Добавлен:
27.08.2019
Размер:
45.68 Кб
Скачать

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

- Характеризует сокрытие отдельных деталей внутреннего устройства классов от внешних по отношению к нему объектов или пользователей. Инкапсуляция ведет свое происхождение от деления модулей, в некоторых языках программирования, на 2 части: интерфейс и реализацию. При этом в интерфейсной части модуля описываются все объявления, функций и процедур, а возможно и типов данных, доступных за пределами модуля. Указанные процедуры и функции являются способами оказания услуг внешним клиентам. В секции реализации содержится программный код, определяющий конкретные способы реализации объявленных в интерфейсной части процедур и функций. Объявление функции называется прототипом функции.

Полиморфизм

- понимается свойство объектов принимать различные внешние формы, в зависимости от обстоятельств. Применительно к ООП, полиморфизм означает, что действия, выполняемые одноименными методами, могут отличаться, в зависимости от того, к какому классу относится тот или иной метод.

Полиморфизм объектно-ориентированных языков связан с перегрузкой функции, но не тождественен ей. Важно понять, что имена методов и свойств тесно связаны с классами, в которых они описаны.

Полиморфизм тесно связан с механизмом работы виртуальных функции.

Double Sum (double a, double b)

{return a+b;}

Int Sum (int a, int b)

{return a+b;}

Double Sum (double* a, double b)

{double s=0.0;

For (int i=0; i<n; i++)

{s+=a[i]; return s;}

Double Sum (double a[10])

{double s=0.0;

For (int i=0; i<10; i++)

{s+=a[i];

return s;}

Нужная функция будет определена по значениям переменных.

Типы возвращаемого значения не относятся к типу функции.

Int main()

{ double* a=new double[10];

Sum (a,10);

Sum(a[10]);

Sum(10,10);

Sum(10.0,10.0);

}

Полиморфизм связан с механизмом перегрузки функции (приведенной выше) но не тождественен ей. Разница между перегрузкой функции и виртуальными функциями в том, что область видимости перегруженных функции глобальная. Они видны везде в программе, начиная с точки их объявления, а виртуальные функции видны только в том классе, в котором объявлены.

Определение собственных типов данных

Структура и класс.

Структура – собственный или пользовательский тип данных, определяемы с помощью ключевого слова “struct”.

Класс – тоже пользовательский или абстрактный тип данных, определяемый с помощью ключевого слова “class”.

Самое существенное отличие между структурой и классом заключаются в том, что все элементы структуры по умолчанию являются открытыми, то есть общедоступными, а элементы класса по умолчанию являются закрытыми или приватными. Элементы структуры, описываемые через данные, называют полями. Эти же элементы в классах называют данными членами. Элементы структуры, описываемые через функции, называют членами-функциями и функциями-членами.

Struct BOOK

{

Char title[80];

Char author[80];

Int year;

};

Class BOOK

{

Public:

Char title[80];

Char author[80];

Int year;

};

“public” является обязательным ключевым словом, если необходимо, чтобы члены класса были общедоступными.

Инициализация структуры

1 способ

BOOK Novel=

{“paneless programming”,

“I.C.Fingers,

1981

};

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

Указатель – легальная переменная.

Пропустил

Таким образом, к членам структуры или класса можно обратиться через операцию прямого доступа (точка), используя либо сам объект, либо ссылку на него или через операцию косвенного (непрямого) доступа (стрелка), используя указатель на объект (то есть через его адрес). Таким же образом передачи переменных типа структуры или класса, как и обычные типы данных, в функцию производятся по имени (значению), по ссылке или через указатель на структуру или на класс.

{Struct Box

Double l,h,w;

Double volume () {return l*h*w;}

};

Box ShowIt(Box aBox)

{Box bBox;

bBox.l=2*aBox.l;

bBox.h=3*aBox.h;

bBox.w=4*aBox.w;

return bBox;

}

Int main()

{Box matchbox;

Matchbox.l=4.0;

Matchbox.h=2.5;

Matchbox.w=4.5;

Cout<<”The Volume of matchbox= “<<Matchbox.volume()<<endl;

Matchbox=showIt(matchbox);

Cout<<”l= “<<matchbox.l<<endl;

Cout<<”h= “<<matchbox.h<<endl;

Cout<<”w= “<<matchbox.w<<endl;

Cout<<”The new Volume of matchbox= “<<Matchbox.volume()<<endl;

Return 0;}

Замечание:

Передачу экземпляров из структуры или классов по значению можно осуществить только в том случае, если эти объекты не созданы динамической памятью с помощью операции “new”.

Box* ShowIt(Box* aBox)

{Box bBox=&aBox;

bBox->l=2*aBox->l;

bBox->h=3*aBox->h;

bBox->w=4*aBox->w;

return bBox;

}

Int main()

{Box matchbox=new Box;

Matchbox->l=4.0;

Matchbox->h=2.5;

Matchbox->w=4.5;

Cout<<”The Volume of matchbox= “<<Matchbox->volume()<<endl;

Matchbox=showIt(matchbox);

Cout<<”l= “<<matchbox->l<<endl;

Cout<<”h= “<<matchbox->h<<endl;

Cout<<”w= “<<matchbox->w<<endl;

Cout<<”The new Volume of matchbox= “<<Matchbox->volume()<<endl;

Return 0;}

Никогда!Не!Возвращать!Адрес!Локального!Объекта!

Ссылочный вариант:

struct Box

{

double l,h,w;

double volume () {return l*h*w;}

};

Box ShowIt(Box aBox)

{

Box bBox;

Box& rBox = bBox;

rBox.l=2*aBox.l;

rBox.h=3*aBox.h;

rBox.w=4*aBox.w;

return rBox;

}

int main()

{

Box matchbox;

Box& Rmatchbox=matchbox;

Rmatchbox.l=4.0;

Rmatchbox.h=2.5;

Rmatchbox.w=4.5;

cout<<"The Volume of matchbox= "<<Rmatchbox.volume()<<endl;

Rmatchbox=ShowIt(Rmatchbox);

cout<<"l= "<<Rmatchbox.l<<endl;

cout<<"h= "<<Rmatchbox.h<<endl;

cout<<"w= "<<Rmatchbox.w<<endl;

cout<<"The new Volume of matchbox= "<<Rmatchbox.volume()<<endl;

system ("pause");

return 0;

}

Все упомянутое про структуры можно использовать и в классах.

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

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

using std::cout;

using std::cin;

using std::endl;

class Box

{

public:

double l,h,w;

double volume ();

};

double Box::volume()

{return l*h*w;}

int main()

{

int value=0;

cout<<"enter the Value"<<endl;

cin>>value;

cout<<"your Value is "<<value<<endl;

system ("pause");

return 0;

}

В случае, когда функция определяется внутри определения класса, то компилятор неявно ее трактует как встроенную (inline) функцию.