Объектно-ориентированное программирование в С+

Содержание

Слайд 2

Структура курса ООП Глава 1. Классы и объекты Глава 2. Наследование,

Структура курса


ООП

Глава 1.
Классы и объекты

Глава 2.
Наследование,
полиморфизм

Глава 3.
Классы-шаблоны,
БСШ*

Приложение.
Класс Faculty

БСШ* – Библиотека

Стандартных Шаблонов
Слайд 3

inline-функции Код тела функции задается в отдельном месте ОП. При обращении

inline-функции

Код тела функции задается в отдельном месте ОП.
При обращении к функции

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

inline-функции Компилятор может выполнить подстановку тела функции в место её вызова,

inline-функции

Компилятор может выполнить подстановку
тела функции в место её вызова, если
определить функцию

как встраиваемую с
помощью ключевого слова inline
inline определение_функции
inline int sum2(int a, int b)
{ return a+b;}

При вызове функции, например,
int x = sum2(5, 7);
компилятор выполнит
подстановку
фактических аргументов и тела функции
int x = 5 + 7;

Слайд 5

Замечание. inline-функциями имеет смысл определять только небольшие функции, в частности, без циклов и оператора switch.

Замечание.

inline-функциями имеет смысл
определять только небольшие функции, в
частности, без циклов и

оператора
switch.
Слайд 6

Область видимости Операция :: называется операцией определения области видимости(области действия). Это

Область видимости

Операция :: называется операцией определения
области видимости(области действия).
Это двуместная операция формата
имя_класса

:: имя_ч/функции(ч/данного)
Существует и одноместная операция :: формата
:: имя_глобальной_переменной
int x = 7; // глобальная переменная
void ff( int y)
{ int x = 1, z;
z = x + ::x;
}

//лок

лок

глоб

Слайд 7

Введение. Принципы ООП ООП – технология разработки больших программ Центральное понятие

Введение. Принципы ООП

ООП – технология разработки больших программ

Центральное понятие ООП объект

Объект

– это данные и операции(функции), их обрабатывающие, любого уровня сложности.

Объект = данные + операции и функции,
их обрабатывающие

Слайд 8

Причем в ООП наибольшее внимание уделяется не реализации объектов, а связям

Причем в ООП наибольшее внимание уделяется не реализации объектов, а связям

между ними
Эти связи организованы в виде сложных иерархических структур, где новые типы объектов создаются на основе имеющихся.
Слайд 9

ООП базируется на 3-х основных принципах 1. Инкапсуляция 2. Наследование 3. Полиморфизм ООП

ООП базируется на 3-х основных принципах

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

2. Наследование

3. Полиморфизм

ООП

Слайд 10

1. Инкапсуляция - сокрытие информации Этот принцип предполагает создание пользовательских типов

1. Инкапсуляция - сокрытие информации

Этот принцип предполагает создание пользовательских типов

данных, включающих как данные, так и операции и функции, их обрабатывающие
Никакие другие данные не могут использовать эти операции и функции и наоборот
Контроль за санкционированным использованием данных и функций выполняет компилятор
Такие данные называются абстрактными в отличие от стандартных (встроенных) типов данных (int, char,...)
Механизм создания абстрактных типов данных осуществляется через понятие класса.
Слайд 11

2. Наследование – создание иерархии абстрактных типов данных Определяется базовый класс,

2. Наследование – создание иерархии абстрактных типов данных

Определяется базовый класс,
содержащий

общие характеристики
(прародительский класс), а из него по
правилам наследования строятся
порожденные классы, сохраняющие
свойства и методы базового класса и
дополненные своими характерными
свойствами и методами.
Слайд 12

3. Полиморфизм - множественность форм Это принцип использования одинаковых имен функций

3. Полиморфизм - множественность форм

Это принцип использования одинаковых
имен функций и знаков

операций для
обозначения однотипных действий
В языке С++ полиморфизм используется в
двух видах:

а) для обычных функций и операций над стандартными и абстрактными типами данных. Это так называемая «перегрузка функций и операций»;

б) для функций, определенных в иерархии наследования. Это так называемые «виртуальные функции».

Слайд 13

Язык С++ был создан в лаборатории Bell Labs в начале 80-х

Язык С++ был создан в лаборатории Bell
Labs в начале 80-х годов

программистом
Бьярном Страуструпом в течение
нескольких месяцев путем добавления к
С аппарата классов. Первый
компиляторы появились в 1985 г.

Буторина Н.Б., Матросова А.Ю., Сибирякова В.А. Основы технологии объектно-ориентированного программирования в языке С++

Литературы много. В НБ:

Слайд 14

КЛАССЫ И ОБЪЕКТЫ


КЛАССЫ И ОБЪЕКТЫ

Слайд 15

п1. Определение класса. Сокрытие информации Структура - это комбинированный тип данных,

п1. Определение класса. Сокрытие информации

Структура - это комбинированный тип данных,
один элемент

которого может включать произвольное
количество данных разных типов, которые называются
полями структуры.
Формат определения структуры:
struct имя_структуры {поле1; поле2;...;};
Слайд 16

п1. Определение класса. Сокрытие информации Например, struct anketa {char fio[25], faclt[10];

п1. Определение класса. Сокрытие информации

Например,
struct anketa
{char fio[25], faclt[10]; int

group;};
Определение структуры обычно задается вне функций,
в начале программы, как глобальное.
Определим переменную
anketa p;
strcpy(p.fio,”Петров”);
strcpy(p.faclt,”ФПМК”);
p.group = 1122;

anketa –
новый тип данных

Слайд 17

Инициализация Структуру можно инициализировать при определении переменных anketa s = {

Инициализация

Структуру можно инициализировать при
определении переменных
anketa s = { “Шарапов”, ”ЮФ”, 711};
Можно

задать указатель на структуру
anketa *t;
t = &s;
t->group = 773;

Операция -> называется «взять значение поля по адресу» или «разадресация»

Слайд 18

Определение класса базируется на понятии структуры и имеет вид class имя_класса

Определение класса базируется на понятии
структуры и имеет вид
class имя_класса {тело_класса};
Тело класса

содержит определение данных
класса –
член-данных
и объявление или определение функций, их
обрабатывающих, –
член-функций
По иной терминологии ч/данные - свойства,
ч/функции - методы
Слайд 19

const int MS = 255; class String { char line[MS]; int

const int MS = 255;
class String
{ char line[MS];
int len;

void Fill(const char *);
int Len() { return len;}
void Print() { cout << line; }
char & Index(int i);
};
Здесь член-данные - line, len;
член-функции - Fill, Print, Len, Index.

Класс String

объявление

определение

объявление

определение

Слайд 20

Член-функции отличаются от обычных функций следующим: а) они имеют привилегированный доступ

Член-функции отличаются от обычных
функций следующим:
а) они имеют привилегированный доступ к член-данным

класса, т.е. используют их непосредственно;
б) область их видимости(действия) - класс, т.е. они могут использоваться только с переменными этого класса через операцию ‘.’(точка);
в) член-данные могут располагаться в любом месте описания класса, они «видны» всем его член-функциям.
Слайд 21

К сожалению, Таким образом определенный класс мы использовать не сможем. Единственное,

К сожалению,

Таким образом определенный класс мы использовать не сможем. Единственное,

что мы можем – это определить переменные этого типа или указатель
Например,
String str1,*str;
str1.len =10;
‘String::len’ is not accessible -
«Переменная len из класса String недоступна»
Слайд 22

Типы доступа Для того, чтобы работать с классом, для его член-данных

Типы доступа

Для того, чтобы работать с классом, для его
член-данных и член-функций

надо определить
тип доступа.
Существует 3 типа доступа:
private - член-данные и член-функции доступны
только член-функциям класса;
protected - член-данные и член-функции
доступны член-функциям базового и
порожденного классов (гл. 2);
public - член-данные и член-функции
общедоступны.

Обычно бóльшую часть член-данных размещают
в части private - сокрытие информации,
а бóльшую часть член-функций – в public –
интерфейс с программой

Слайд 23

Умолчание Для классов по умолчанию считается доступ - private (поэтому в

Умолчание

Для классов по умолчанию считается
доступ - private (поэтому в нашем
примере оказался

тип доступа private для
всех член-данных и член-функций, т.е.
всё мы «спрятали в капсулу». Отюда
термин “инкапсуляция”),
для структур, наоборот, - public.
Слайд 24

const int MS = 255; class String { char line[MS]; int

const int MS = 255;
class String
{ char line[MS];
int len;

void Fill(const char *);
int Len() { return len;}
void Print() { cout << line; }
char & Index(int i);
};

public:

Описания private и public могут стоять в любом месте описания класса и повторяться.

Теперь можно записать оператор
int m = str1.Len(); // функция Len() общедоступна

Слайд 25

Член-функции и операция :: Вернемся к член-функциям: две из них определены

Член-функции и операция ::

Вернемся к член-функциям:
две из них определены в

классе(Len и Print),
две объявлены(Fill и Index)
Определить объявленные функции можно вне
класса, используя операцию ‘::’
Формат определения:
тип_возвращаемого_значения имя_класса ::
имя_функции (список_аргументов)
{тело_функции}
Слайд 26

Определим вне класса функции, объявленные в нём: void String:: Fill (

Определим вне класса функции,
объявленные в нём:
void String:: Fill ( const char

*s)
{ for( len = 0; line[len] != ‘\0’; len++)
line[len] = s[len]; }
char & String:: Index( int i )
{ return line[i]; // функция возвращает i-ый // элемент строки
}

const означает -
s менять нельзя!

Слайд 27

? Чем же отличаются член- функции, определенные в теле класса и вне его?

?

Чем же отличаются член-
функции, определенные в теле
класса и вне его?

Слайд 28

При определении в теле класса они получают неявно статус inline (поэтому,

При определении в теле класса они получают неявно статус inline
(поэтому,

если функция определена
в классе и содержит операторы цикла,
то компилятор может выдать предупреждение о
возможной неэффективности).
Функциям, определенным вне класса, также
можно присвоить статус inline явно первым
словом
inline char & String:: Index(...){...}
Слайд 29

п2. Объект Класс - это тип данных, а не объект Определение.Объект

п2. Объект

Класс - это тип данных, а не объект
Определение.Объект -

это переменная, тип
которой – класс, и определяется он обычным
образом
void main()
{ String s1, s2, *s3; // s1, s2 - объекты, // s3 - указатель на объект.
}
Говорят также, что s1, s2 - экземпляры класса.
Для каждого из них будет отведена память по
255 + 4 байтов.
Слайд 30

Размещение в памяти Заметим, что указатель s3 пока не определен, т.е.

Размещение в памяти

Заметим, что указатель s3 пока не определен, т.е. там

тоже
грязь.

? - это грязь

4

4

Слайд 31

Работа с объектами К ч/функции обращаемся так же, как к полю

Работа с объектами

К ч/функции обращаемся так же,
как к полю структуры

(через ‘.’) !

void String:: Fill ( const char *s)
{ for( len = 0; line[len] != ‘\0’; len++)
line[len] = s[len]; }

Слайд 32

Заменим маленькую ‘о’ на большую в объекте s1 s1[0] = ’O’;

Заменим маленькую ‘о’ на большую в объекте s1

s1[0] = ’O’;
s1.line[0]

= ‘O’;

// ошибка - s1 - это не массив, // и операция [] в нем // не определена!

//ошибка - line – приватное
// ч/данное, в main(как и в других // внешних функциях) его // использовать нельзя!

Слайд 33

Это верно - пока только так, через ч/функцию Index(int), можно «добраться»

Это верно - пока только так, через ч/функцию Index(int), можно

«добраться» до символа строки

cout << s1.len;

s3 = &s1; // s3 – указатель на строку s1

cout << s1.Len(); // Так можно получить длину строки

s3 -> Index(0) = ‘O’; // Используя функцию Index(int),
// заменим еще раз букву ‘о’ на ’О’

s3 -> Print(); // Вывод слова «Объект»

// ошибка - len приватное член-данное

Слайд 34

s3 = &s2; // теперь s3 - указатель на объект s2

s3 = &s2; // теперь s3 - указатель на объект s2

Эту

связь удалили

И связали s3 с объектом s2

s3 -> Index(s3->Len ()-1) = ‘.’; // Используя член-функции класса // Len () и Index() поставим
// в конце строки s2 символ '.'

.

s3 -> Print(); // вывод фразы “ класса String.”