Введение в объектно-ориентированное программирование на основе языка Си++
Выбери формат для чтения
Загружаем конспект в формате pdf
Это займет всего пару минут! А пока ты можешь прочитать работу в формате Word 👇
Лекция №1. Введение в объектно-ориентированное программирование на основе алгоритмического языка Си++
Содержание: объектно-ориентированное программирование как продолжение структурного; понятие класса и объекта; поля и методы класса;
личные и общие элементы класса; конструкторы и деструкторы; пример консольного приложения, использующего классы.
1. О СТРУКТУРНОМ И ОБЪЕКТНО-ОРИЕНТИРОВАННОМ
ПРОГРАММИРОВАНИИ
В курсе основ программирования вы убедились (во всяком случае, должны были убедиться), что грамотное программирование является
структурным программированием.
Структурное программирование подразумевает:
точно обозначенные управляющие (основные) структуры алгоритмов;
соответствующее логике программы разбиение ее на программные блоки;
автономные подпрограммы, в которых преимущественно используются
локальные переменные;
отсутствие (или, по крайней мере, ограниченное использование) операторов безусловного перехода – goto, break и др.
Последовательное применение концепций структурного программирования предполагает на каждом этапе проектирования программы
разделение задачи на связанные между собой подзадачи, при этом программа
разбивается на логически завершенные и стандартно кодируемые части. В
результате код программы легко читается не только ее автором, но и другими
программистами, и число ошибок при программировании существенно
уменьшается. Естественно, преимущества структурного программирования
наиболее ярко проявляются при написании больших программ, когда проектирование программы просто невозможно без разделения части. Но и при создании средних и малых программ структурный подход дает хорошие результаты.
Развитие программирования привело к новому подходу – объектноориентированному программированию (ООП). ООП, так же как и структурное программирование, предполагает разделение задачи на подзадачи, но
при этом каждая подзадача становится самостоятельным объектом, содержащим свои коды и данные.
Объектно-ориентированный подход к программированию эффективен
в тех случаях, когда некоторый реально существующий предмет характеризуется очень большим числом параметров. Тогда подпрограммы, описывающие
алгоритмы обработки или функционирования такого предмета, имеют
настолько большое число формальных параметров, что программирование их
вызовов слишком трудоемко и сопряжено с большим количеством ошибок.
Эффективным методом программирования таких задач является создания в
программе объекта, соответствующего предмету. Этот объект будет включать
в себя данные, соответствующие параметрам предмета, и подпрограммы (в
Си++ функции), описывающие алгоритмы обработки или функционирования
предмета. Данные объекта должными являться по умолчанию доступными
для алгоритмов объекта (как бы быть глобальными для этих алгоритмов) и не
включаться в списки параметров соответствующих подпрограмм. Таким образом, количество параметров подпрограмм существенно уменьшится.
Примером такого «предмета» с большим количеством параметров может служить окно приложения какой-либо оконной операционной системы,
например, Windows. Подсчитайте, сколько параметров у окна приложения
или окна папки!
2. ОПРЕДЕЛЕНИЕ КЛАССА И ОБЪЕКТА В C++
В С++ (и во многих других объектно-ориентированных алгоритмических языках, например, в Объектном Паскале) вводится новый тип данных –
класс. Переменная типа класс называется объектом. Иногда объект называют также экземпляром класса. Формально описание класса напоминает
структуру, но класс, кроме полей (переменных), содержит методы, которые
задают допустимые действия над полями класса. Общее название для полей и
методов – элементы класса.
Ниже дается простейшее описание класса на языке С++:
class имя_класса {
private:
описание личных элементов класса
public:
описание общих элементов класса
};
2
Под личными элементами класса (private) понимаются такие элементы, которые могут использоваться только методами своего класса. К общим элементам класса (public) доступ разрешен в любом месте программы.
Существуют и другие способы доступа к элементам класса (см. лекцию 2).
Поля класса описываются внутри класса как обычные переменные. Методы – это функции, которые можно применять к полям. Считается хорошим
стилем программирования, что внутри класса методы задаются своими прототипами. Вне класса (ниже его описания) приводится полное описание метода. Очень короткие методы можно полностью описывать внутри класса.
Как правило, поля являются личными элементами класса, т. е. доступ к
полям разрешен только внутри методов класса. Это положение можно рассматривать как простейшую формулировку принципа инкапсуляции (см.
лекцию 2).
Если внутри класса метод описан прототипом:
тип_результата имя_метода (список типов параметров),
то при полном описании вне класса метод имеет заголовок:
тип_результата имя_класса::имя_метода (список параметров),
т. е. в заголовке перед именем метода указывается имя класса (через
знак ::).
Существуют особые методы класса: конструкторы и деструкторы.
Назначение конструктора заключается в создании экземпляра класса и инициализации его полей. Имя конструктора совпадает с именем класса. Конструктор никогда не вызывается явно, его вызов осуществляется компилятором в момент создания экземпляра класса.
Деструктор вызывается для уничтожения экземпляра класса. Имя деструктора образуется как ~имя_класса. Деструктор может вызываться в программе явно или (что происходит обычно) его вызов обеспечивается компилятором в момент уничтожения экземпляра класса.
Наличие конструктора и деструктора для любого класса обязательно;
при их отсутствии компилятор автоматически создает стандартные варианты
конструктора и деструктора.
Экземпляры класса могут создаваться автоматически или динамически. Уничтожение автоматически созданных экземпляров классов происходит также автоматически при завершении выполнения блока функции, в
3
котором они были определены. Определение (описание) автоматического экземпляра класса может встречаться в любом месте функции и имеет вид:
имя_класса имя_экземпляра(параметры конструктора);
Перед созданием динамического экземпляра класса (по аналогии с любыми динамическими переменными) необходимо объявить указатель на экземпляр:
имя_класса* указатель_на_экземпляр;
Динамический экземпляр класса создается с помощью оператора new, а
уничтожается с помощью оператора delete:
указатель_на_экземпляр= new имя_класса (параметры конструктора);
delete указатель_на_экземпляр;
Метод класса (по аналогии с полем структуры) вызывается одним из
следующих способов:
имя_экземпляра.имя_метода или имя_экземпляра->имя_метода
3. ПРИМЕР КОНСОЛЬНОЙ ПРОГРАММЫ, ИСПОЛЬЗУЮЩЕЙ
КЛАССЫ
Пример. Ниже приведена программа, в которой описан и используется
класс cl_mas для обработки двумерных массивов. Кроме конструктора, класс
содержит методы ввода матрицы, вычисления минимальных значений ее
строк и вывода этих минимальных значений.
#include
#include
using namespace std;
class matr {private:
float **a;
int n,m;
char c;
float *min_str;
public:
matr(int n1, int m1,char c1);
void calc_min();
4
void vvod();
void vivod();
};
matr::matr(int n1, int m1, char c1)
{n=n1; m=m1; c=c1;
a=new float* [n];
int i,j;
for (i=0;ia[i][j])
5
min_str[i]=a[i][j];
}
}
void main()
{ matr *a, *b;
a=new matr(2,3,'a');
b=new matr(4,2,'b');
a->vvod();
b->vvod();
a->calc_min();
b->calc_min();
a->vivod();
b->vivod();
_getch();
delete a;
delete b;
}
Далее для сравнения приводится программа, выполняющая ту же задачу, что
и предыдущая, но без использования классов, а с использованием классических функций Си. Сравните число параметров функций, выполняющих одинаковые алгоритмы, в этих двух программах.
#include
#include
void masout(float a[ ],int n,char c);/* то это шаблон функции вывода*/
/*первый размер у массивов-формальных параметров можно*/
/* не указывать, второй задан по максимуму*/
void matrin(float [ ][3],int n,int m,char c);/* c -имя матрицы*/
/* используется при выводе пояснительных фраз и приглашений*/
void minmatr(float [ ][3],int n,int m,float min[ ]);
/* n и m во всех функциях передаются по значению, т. к. их*/
/*фактические значения - константы*/
void main()
{float a[2][3],b[4][3], mina[2], minb[4];
matrin(a,2,3,'a'); matrin(b,4,2,'b');
6
minmatr(a,2,3,mina); minmatr(b,4,2,minb);
masout(mina,2,'a'); masout(minb,4,'b');
_getch();
}
void minmatr(float a[][3],int n,int m,float min[])
{int i,j;
for (i=0; i>a[i][j];
}
void masout(float a[],int n,char c)
{int i;
cout<<"Results for "<
Тебе могут подойти лекции
А давай сэкономим
твое время?
твое время?
Дарим 500 рублей на первый заказ,
а ты выбери эксперта и расслабься
Включи камеру на своем телефоне и наведи на Qr-код.
Кампус Хаб бот откроется на устройстве
Не ищи – спроси
у ChatGPT!
у ChatGPT!
Боты в Telegram ответят на учебные вопросы, решат задачу или найдут литературу
Попробовать в Telegram
Оставляя свои контактные данные и нажимая «Попробовать в Telegram», я соглашаюсь пройти процедуру
регистрации на Платформе, принимаю условия
Пользовательского соглашения
и
Политики конфиденциальности
в целях заключения соглашения.
Пишешь реферат?
Попробуй нейросеть, напиши уникальный реферат
с реальными источниками за 5 минут
с реальными источниками за 5 минут
Введение в объектно-ориентированное программирование на основе языка Си++
Хочу потратить еще 2 дня на работу и мне нужен только скопированный текст,
пришлите в ТГ