Объектно-ориентированное программирование на c++. Лекция 1

Содержание

Слайд 2

Книги и ссылки

1. Страуструп Б. Язык программирования C++. Москва: Вильямс, 2011
2. Мейерс

Книги и ссылки 1. Страуструп Б. Язык программирования C++. Москва: Вильямс, 2011
С. - Эффективный и современный C++. 42 рекомендации по использованию C++11 и C++14, 2016
3. Д. Элджер - Библиотека программиста С++ - Гарвард: World Group, 2004.
4. Стив Макконнелл Совершенный код
5. http://www.cplusplus.com

Слайд 3

Методология познания

Метод проб и ошибок.
Чем больше сделаете ошибок, тем быстрее научитесь.

Методология познания Метод проб и ошибок. Чем больше сделаете ошибок, тем быстрее научитесь.

Слайд 4

Интегрированная Среда Разработки (IDE) для С++: Microsoft Visual Studio vv. 2012-2019

Интегрированная Среда Разработки (IDE) для С++: Microsoft Visual Studio vv. 2012-2019

Слайд 5

Итак, ООП на с++

Итак, ООП на с++

Слайд 6

Исследования, проведенные в 1970-х годах в Массачусетском технологическом институте и исследовательском центре

Исследования, проведенные в 1970-х годах в Массачусетском технологическом институте и исследовательском центре
Xerox Palo Alto Research Center, привели к разработке философии объектно-ориентированного программирования и созданию языков реализации, включая Smalltalk, Java, C++.

Слайд 7

Предполагается, что вы уже знаете понятия цикла (for, while, do{ }while), главной

Предполагается, что вы уже знаете понятия цикла (for, while, do{ }while), главной
функции (main/WinMain), операторов if/else, switch, return.
Также предполагается, что вы знаете, что такое указатель, ссылка и их взаимоотношения, а также понимаете арифметику указателей, включая операторы инкремента (++) и декремента (--).
Я буду постепенно добавлять новые термины и использовать их в примерах.
Понятия типа, класса, полиморфной иерархии, глубокого копирования, контейнеров, итераторов, адаптеров, функторов, умных указателей, потоков выполнения будут раскрываться последовательно от лекции к лекции.
Запреты использования.
При решении задач на лабах / семинарах и в курсовой работе запрещено применять ключевое слово auto, а также двухсекционный цикл for : for ( auto I : v) .
for следует пользоваться только трехсекционным, например:
for (T t = begin() ; t != end(); ++t )

Слайд 8

Чего нет в книгах и учебниках

Каждый вызов функции – это отражение вашего

Чего нет в книгах и учебниках Каждый вызов функции – это отражение
желания получить нужный результат. Это здравый смысл операции!
Каждый элемент программы несет в себе ответственность за его использование. Поэтому, например, применение умных указателей, которые сами могут освободить выделенную память – лишает программиста ответственного поведения.

Слайд 9

Создание проекта

Создание проекта

Слайд 10

Компиляция проекта

Компиляция проекта

Слайд 11

В начале файла программы следует указать нужные хидеры:

#include
#include
#include
#include // или set или

В начале файла программы следует указать нужные хидеры: #include #include #include #include
map
#include
#include
using namespace std; // использовать пространство имен std

Слайд 12

Файлы

3 способа доступа к файлам данных:
Windows API: CreateFile (и другие функции для

Файлы 3 способа доступа к файлам данных: Windows API: CreateFile (и другие
работы с файлами)
C: fopen (и прочие функции для работы с файлами из stdio.h)
C++: fstream (ifstream, ofstream ) (из stl)

Слайд 13

Потоки данных

С: printf и scanf (#include)
C++: cin и cout (#include)
Файловые потоки:
(#include)

Потоки данных С: printf и scanf (#include ) C++: cin и cout

Слайд 14

#include #include void error (char* s, char* s2 ="")

#include #include void error (char* s, char* s2 ="") { cerr Пример
{ cerr << s << ' ' << s2 << '\n'; exit(1); } int main(int argc, char* argv[]) { ifstream from(“file1.txt”); ofstream to(“file2.txt”); char ch; while (from.get(ch)) to.put(ch); if (!from.eof() || to.bad()) error("something strange happened"); return 0; }

Пример

Слайд 15

Стандартная библиотека шаблонов STL

Включает, основанную на методологии обобщенного программирования библиотеку классов, содержащую:
Контейнеры

Стандартная библиотека шаблонов STL Включает, основанную на методологии обобщенного программирования библиотеку классов,
(для хранения данных произвольного типа)
Итераторы (для осуществления доступа к данным контейнеров)
Алгоритмы
Адаптеры контейнеров, итераторов и функционалов.
Стримы (streams) для выполнения потоковых операций с данными
Потоки исполнения (threads) и элементы синхронизации в потоках
Прочие элементы, например, умные указатели

Слайд 16

Пример stl-алгоритма: сортировка

#include
#include
using namespace std;
vector v;
for ( int i=10; i<

Пример stl-алгоритма: сортировка #include #include using namespace std; vector v; for (
0; i--)
v.push_back(i); // 10,9,8,7,6,5,4,3,2,1
vector ::iterator it= v.begin();
sort (v.begin(),v.end()); // 1,2,3,4,5,6,7,8,9,10

Слайд 17

Три основных свойства ООП

Абстракция (данных) (отвлечение)
Инкапсуляция (скрытие)
Полиморфизм (разнообразие)
В следующих лекциях - подробности

Три основных свойства ООП Абстракция (данных) (отвлечение) Инкапсуляция (скрытие) Полиморфизм (разнообразие) В следующих лекциях - подробности

Слайд 18

Пример ООП- программы

class A{
public:
A(){ }
~A(){ }
virtual void print(){cout<<"a"<};
class B: public

Пример ООП- программы class A{ public: A(){ } ~A(){ } virtual void
A{
public:
void print(){cout<<"b"<};
void print_all ( A** v , int size ) {
// распечатать все
int i = 0;
while ( i {
(v [ i ]) -> print ( );
i = i + 1;
}
}

int _tmain(int argc, _TCHAR* argv[]){
A a;
B b;
A m[2];
m[1]= b;
A*m0[2]={&m[0],&m[1]};
print_all(m0,2);
A*m1[2];
m1[0]=new A;
m1[1]= new B;
print_all( m1,2);
return 1;
}
// Результат выполнения программы:
a
a
a
b

Слайд 19

Отладчик MS Visual Studio

Клавиши отладки:
F9 – поставить или снять точку останова

Отладчик MS Visual Studio Клавиши отладки: F9 – поставить или снять точку
программы
F10 – совершить одно отладочное действие: выполнить одну результирующую операцию.
F11 – войти внутрь функции
SHIFT + F11 – выйти из функции
Окна отладки:
В процессе отладки программы можно открывать большинство окон отладчика. Чтобы просмотреть список окон отладчика, установите точку останова и начните отладку. Когда точка останова будет достигнута и выполнение остановится, выберите пункт Отладка / Окна.

Слайд 22

Для желающих быстро научиться - проекты

На следующих слайдах – 15 проектов, простых!

Для желающих быстро научиться - проекты На следующих слайдах – 15 проектов,
Кто желает, можете их сделать и прислать мне на почту до следующей лекции (суббота вечером).
На каждой лекции я буду давать по подобному домашнему заданию.
Кто станет выполнять задания и присылать их результаты регулярно мне – получит на экзамене автоматом отличную оценку.
Кроме того, можете приходить ко мне заниматься индивидуально, только предварительно надо договориться – шлите письмо.
Также можете присылать любые вопросы.

Слайд 23

Домашнее задание. Создаем проект 1

Домашнее задание. Создаем проект 1

Слайд 24

Сразу как задали имя проекта выбираем кнопку Finish

Сразу как задали имя проекта выбираем кнопку Finish

Слайд 25

Ничего не делаем, сразу выбираем Build Solution

Ничего не делаем, сразу выбираем Build Solution

Слайд 26

В свойствах проекта меняем Unicode на Multi Byte

В свойствах проекта меняем Unicode на Multi Byte

Слайд 27

Запускаем исполнение программы (клавиша F5 или через меню) – если ошибок при

Запускаем исполнение программы (клавиша F5 или через меню) – если ошибок при создании программы нет, то:
создании программы нет, то:

Слайд 28

Создаем проект 2

Создаем проект 2

Слайд 29

Сразу как задали имя проекта выбираем кнопку Finish

Сразу как задали имя проекта выбираем кнопку Finish

Слайд 30

Добавляем заголовочные файлы, получаем код:
#include "stdafx.h"
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int _tmain(int argc, _TCHAR*

Добавляем заголовочные файлы, получаем код: #include "stdafx.h" #include #include #include #include #include
argv[])
{
return 0;
}

Слайд 31

Запускаем исполнение программы (клавиша F5 или через меню) – если ошибок при

Запускаем исполнение программы (клавиша F5 или через меню) – если ошибок при
создании программы нет, то получаем пустое черное окно, которое быстро закроется (или не закроется)

Слайд 32

Создаем проект 3 – pr3, в котором добавляем заголовочные файлы, как в

Создаем проект 3 – pr3, в котором добавляем заголовочные файлы, как в
проекте 2. Кроме того, добавляем строки в главную функцию программы:

int _tmain(int argc, _TCHAR* argv[]) { string s; s= "test"; cout<return 0; }

Затем запускаем построение программы и затем саму программу

Слайд 33

Опять, если нет ошибок, должно открыться черное окно, которое теперь не

Опять, если нет ошибок, должно открыться черное окно, которое теперь не закроется,
закроется, а выведет строку test. Закрыть окно можно нажав клавишу «Return»

Слайд 34

Создаем проекты 4, 5 и 6, в которые добавляем по одному новому

Создаем проекты 4, 5 и 6, в которые добавляем по одному новому
элементу. Смотрим результат.

Новые элементы соответственно:

для 4-го ofstream of; // создает объект-поток of.open("myfile.txt");// создает файл for(int i=0;i<10;i++){ of<} // откройте файл и посмотрите внутрь

для 5
ifstream ifile; // создает объект-поток
ifile.open("myfile.txt");// открывает файл
string s0,s1;
for(; ; ){
ifile>>s0 ; // читает из файла
if( ifile.eof()) break;
s1+=s0+"\n";
} cout<

для 6
ifstream ifile; // создает объект-поток ifile.open("myfile.txt");// открывает файл int a;
vector v;
for(; ; ){
ifile>>a ;
if( ifile.eof()) break;
v.push_back(a); // добавляем в вектор
}
for(int i=0; i}

Слайд 35

Создаем проект 7, в который также добавляем новый элемент, меняющий поведение программы

для

Создаем проект 7, в который также добавляем новый элемент, меняющий поведение программы
7-го: изучаем сортировку ifstream ifile; // создает объект- файловый поток
ifile.open("myfile.txt"); // открывает файл
int a;
vector v;
for(; ; ){
ifile>>a ;
if( ifile.eof()) break;
v.push_back(a);
}
sort(v.begin(),v.end());
// sort(v.rbegin(),v.rend()); // раскомментируйте и сравните рез-т
for(int i=0; i cout<}

Слайд 36

Создаем проект 8, в который также добавляем новый элемент


void Reader::print( ){

Создаем проект 8, в который также добавляем новый элемент void Reader::print( ){
for(int i=0; i cout< }
}
int _tmain(int argc, _TCHAR* argv[])
{
Reader r;
r.read("myfile.txt");
r.print();
getchar();
return 0;
}

для 8 Обернем код классом:
class Reader{
vector m_v;
public:
Reader(){ }
void read(const char* name);
void print();
};
void Reader::read(const char* name){
ifstream ifile;
ifile.open(name);
int a;
for(; ; ){
ifile>>a ;
if( ifile.eof()) break;
m_v.push_back(a);
}
}

Слайд 37

Создаем проект 9, в который добавляем новый элемент – класс с деструктором

Создаем проект 9, в который добавляем новый элемент – класс с деструктором

int _tmain(int argc, _TCHAR* argv[])
{
vector v(10);
for(int i=0;iv[i]=new Test();
}
for(int i=0;idelete v[i] ; v[i]=0;
}
return 0;
}

для 9:
class Test{
public:
Test(){
cout<<"Construct" < }
~Test(){
cout<<"Destruct" < }
};

Можете попробовать закомментировать строку delete v[i] ; v[i]=0;
и увидите, что только на вас лежит забота о созданном объекте

Слайд 38

Создаем проект 10, в котором также изучаем сортировку используя std::set

для 10 void

Создаем проект 10, в котором также изучаем сортировку используя std::set для 10
func(){
ifstream ifile;
ifile.open("myfile.txt");
int a;
set st;
for(; ; ){
ifile>>a ;
if( ifile.eof()) break;
st.insert(a);
}
set ::iterator it=st.begin();
for( ; it != st.end() ;++it){
cout<< *it < }
}
int _tmain(int argc, _TCHAR* argv[])
{
func();
return 0;
}

Слайд 39

Активно используем отладчик: клавиша F9 устанавливает точку остановки – в этот момент можно

Активно используем отладчик: клавиша F9 устанавливает точку остановки – в этот момент
посмотреть, что внутри переменных

Слайд 40

Создаем проекты с 10 по 15, в которые также добавляем по одному

Создаем проекты с 10 по 15, в которые также добавляем по одному
элементу (любые на свой вкус), которые меняют поведение программы

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

oopCpp@yandex.ru

Слайд 41

Перед архивацией папок проекта, важно удалить из них файлы с расширением .sdf

Перед архивацией папок проекта, важно удалить из них файлы с расширением .sdf
и директории Debug и ipch (в версии 2012)

Слайд 42

В современных версиях следует удалить:

В современных версиях следует удалить:

Слайд 43

Пример задачи на диктанты, контрольные, лабораторные, семинары и коллоквиум

Создать полиморфную иерархию

Пример задачи на диктанты, контрольные, лабораторные, семинары и коллоквиум Создать полиморфную иерархию
из двух классов — базового и производного. Внутри задать конструкторы с инициализацией доступной извне строки типа const char* именем класса, передавая его как аргумент конструктора. Написать деструкторы с выводом строки указывающей на принадлежность классу.
В главной функции программы создать несколько объектов указанных типов данных. Затем поместить их в хранилище типа vector, где T — тип данных хранения полиморфных объектов.
Обратите внимание: чтобы единообразно хранить полиморфные объекты одной иерархии в общем хранилище, необходимо в качестве параметра шаблона задавать указатель на базовый класс.
vector < Base* >
а не
vector < Base > , как было бы в c#