Слайд 1Буторина Наталья Борисовна
Объектно-ориентированное
программирование в С++
ООП
Слайд 2Структура курса
ООП
Глава 1.
Классы и объекты
Глава 2.
Наследование,
полиморфизм
Глава 3.
Классы-шаблоны,
БСШ*
Приложение.
Класс Faculty
БСШ* –
Библиотека Стандартных Шаблонов
Слайд 3inline-функции
Код тела функции задается в отдельном месте ОП.
При обращении к
функции компилятор
- запоминает определенную информацию для организации возврата в
вызывающую функцию,
- организует передачу аргументов в вызываемую функцию и
- переходит на нее.
Перед выходом из функции компилятор
восстанавливает информацию для правильного
продолжения работы вызывающей функции.
Слайд 4inline-функции
Компилятор может выполнить подстановку
тела функции в место её вызова, если
определить
функцию как встраиваемую с
помощью ключевого слова inline
inline определение_функции
inline int sum2(int
a, int b)
{ return a+b;}
При вызове функции, например,
int x = sum2(5, 7);
компилятор выполнит
подстановку
фактических аргументов и тела функции
int x = 5 + 7;
Слайд 5Замечание.
inline-функциями имеет смысл
определять только небольшие функции, в
частности, без циклов
и оператора
switch.
Слайд 6Область видимости
Операция :: называется операцией определения
области видимости(области действия).
Это двуместная операция
формата
имя_класса :: имя_ч/функции(ч/данного)
Существует и одноместная операция :: формата
:: имя_глобальной_переменной
int x
= 7; // глобальная переменная
void ff( int y)
{ int x = 1, z;
z = x + ::x;
}
//лок
лок
глоб
Слайд 7Введение. Принципы ООП
ООП – технология разработки больших программ
Центральное понятие ООП
объект
Объект – это данные и операции(функции), их обрабатывающие, любого уровня
сложности.
Объект = данные + операции и функции,
их обрабатывающие
Слайд 8Причем в ООП наибольшее внимание уделяется не реализации объектов, а
связям между ними
Эти связи организованы в виде сложных иерархических
структур, где новые типы объектов создаются на основе имеющихся.
Слайд 9ООП базируется на 3-х основных принципах
1. Инкапсуляция
2. Наследование
3. Полиморфизм
ООП
Слайд 101. Инкапсуляция - сокрытие информации
Этот принцип предполагает создание пользовательских
типов данных, включающих как данные, так и операции и функции,
их обрабатывающие
Никакие другие данные не могут использовать эти операции и функции и наоборот
Контроль за санкционированным использованием данных и функций выполняет компилятор
Такие данные называются абстрактными в отличие от стандартных (встроенных) типов данных (int, char,...)
Механизм создания абстрактных типов данных осуществляется через понятие класса.
Слайд 112. Наследование – создание иерархии абстрактных типов данных
Определяется базовый
класс,
содержащий общие характеристики
(прародительский класс), а из него по
правилам наследования строятся
порожденные
классы, сохраняющие
свойства и методы базового класса и
дополненные своими характерными
свойствами и методами.
Слайд 123. Полиморфизм - множественность форм
Это принцип использования одинаковых
имен функций и
знаков операций для
обозначения однотипных действий
В языке С++ полиморфизм используется в
двух
видах:
а) для обычных функций и операций над стандартными и абстрактными типами данных. Это так называемая «перегрузка функций и операций»;
б) для функций, определенных в иерархии наследования. Это так называемые «виртуальные функции».
Слайд 13Язык С++ был создан в лаборатории Bell
Labs в начале 80-х
годов программистом
Бьярном Страуструпом в течение
нескольких месяцев путем добавления к
С аппарата
классов. Первый
компиляторы появились в 1985 г.
Буторина Н.Б., Матросова А.Ю., Сибирякова В.А. Основы технологии объектно-ориентированного программирования в языке С++
Литературы много. В НБ:
Слайд 15п1. Определение класса. Сокрытие информации
Структура - это комбинированный тип данных,
один
элемент которого может включать произвольное
количество данных разных типов, которые называются
полями
структуры.
Формат определения структуры:
struct имя_структуры {поле1; поле2;...;};
Слайд 16п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 = { “Шарапов”, ”ЮФ”,
711};
Можно задать указатель на структуру
anketa *t;
t = &s;
t->group = 773;
Операция
-> называется «взять значение поля по адресу» или «разадресация»
Слайд 18Определение класса базируется на понятии
структуры и имеет вид
class имя_класса {тело_класса};
Тело
класса содержит определение данных
класса –
член-данных
и объявление или определение
функций, их
обрабатывающих, –
член-функций
По иной терминологии ч/данные - свойства,
ч/функции - методы
Слайд 19const 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 для
всех член-данных и член-функций, т.е.
всё мы
«спрятали в капсулу». Отюда
термин “инкапсуляция”),
для структур, наоборот, - public.
Слайд 24const 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 ( 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 char & String:: Index(...){...}
Слайд 29п2. Объект
Класс - это тип данных, а не объект
Определение.Объект
- это переменная, тип
которой – класс, и определяется он обычным
образом
void main()
{ String s1, s2, *s3; // s1, s2 - объекты, // s3 - указатель на объект.
}
Говорят также, что s1, s2 - экземпляры класса.
Для каждого из них будет отведена память по
255 + 4 байтов.
Слайд 30Размещение в памяти
Заметим, что указатель 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.line[0] = ‘O’;
// ошибка - s1 - это не
массив, // и операция [] в нем // не определена!
//ошибка - line – приватное
// ч/данное, в main(как и в других // внешних функциях) его // использовать нельзя!
Слайд 33
Это верно - пока только так, через ч/функцию Index(int),
можно «добраться» до символа строки
cout
// s3 – указатель на строку s1
cout << s1.Len(); // Так можно получить длину строки
s3 -> Index(0) = ‘O’; // Используя функцию Index(int),
// заменим еще раз букву ‘о’ на ’О’
s3 -> Print(); // Вывод слова «Объект»
// ошибка - len приватное член-данное
Слайд 34s3 = &s2; // теперь s3 -
указатель на объект s2
Эту связь удалили
И связали s3 с объектом
s2
s3 -> Index(s3->Len ()-1) = ‘.’; // Используя член-функции класса // Len () и Index() поставим
// в конце строки s2 символ '.'
.
s3 -> Print(); // вывод фразы “ класса String.”
Слайд 35Динамический объект
s3 = new String;
s3 -> Print();
}
// Связь с
s2 разорвана!
s3 ->Fill(“Объект в динамической памяти”);
s3
// В динамической области(куче) берем память под
// поля объекта String.