Модуль 3.1. Обзор языка С++.pptx
- Количество слайдов: 38
Введение в объектноориентированное программирование
Почему нужно объектно-ориентированное программирование Ограниченные возможности других методов программирования Структурное программирование: Процедурные языки Деление программы на функции и модули Недостатки структурного программирования: Неограниченный доступ функций к глобальным данным Глобальные переменные – доступны из любой функции Локальные переменные – доступны только функции А Локальные переменные – доступны только функции В Функция А Функция В Плохое отображение картины реального мира Функци Данные Структурное и программирование Свойства Поведени е Реальный объект
Объектно-ориентированный подход Объединение данных и действий, производимых над этими данными в единое целое, называемое объектом
Объекты Разбиение задачи на функции Разбиение задачи на объекты
Объекты
Инкапсуляция механизм связывающий воедино код (методы) и данные, которыми он манипулирует, а также обеспечивающий их защиту от внешнего вмешательства и неправильного использования Объект – средство инкапсуляции Внутри объекта код и данные могут быть: открытыми – доступны из любой части программы закрытыми – доступны только из другой части этого же объекта Новый тип объекта – это новый тип данных
Наследование процесс, в ходе которого один объект может приобрести свойства другого
Полиморфизм атрибут, позволяющий с помощью одного интерфейса управлять доступом к целому классу объектов «Один интерфейс – несколько методов» Одно имя функции или оператора – разные варианты их определения, реализующие конкретные действия для каждого типа данных
Класс и его объекты
Язык С++
Структура программы
Объекты, функции и main()
Класс сlass имя_класса { закрытые данные и функции спецификатор доступа: данные и функции … спецификатор доступа: данные и функции } список_объектов; сlass имя_класса { закрытые данные и функции спецификатор доступа: данные и функции … спецификатор доступа: данные и функции }; имя_класса список_объектов;
Классы и объекты
Общая форма объявления класса сlass имя_класса { закрытые данные и функции спецификатор доступа: данные и функции … спецификатор доступа: данные и функции } список_объектов; сlass имя_класса { закрытые данные и функции спецификатор доступа: данные и функции … спецификатор доступа: данные и функции }; имя_класса список_объектов;
Классы и объекты Класс – логическая абстракция Объявление класса – объявление типа данных Объект – физическое воплощение логической абстракции Объявление объекта – объявление переменных типа class Спецификаторы доступа: public – открывает доступ к функциям и данным класса из других частей программы private – закрывает доступ к функциям и данным класса из других частей программы, они доступны только члена данного класса protected – необходим при наследовании классов
Пример создания простых классов Разработать программу, которая вводит фактические данные из таблицы и выводит на экран таблицу, подобную той, которая находится в индивидуальном задании (включая заголовок и примечания) Задание к выполнению ▪ Необходимо разработать программу, реализующую простой класс на основе заданной структуры данных. ▪ Кроме того, необходимо разработать набор функций-аксессоров вида (get, set и show (в лекции метод display). ▪ Функция main должна иллюстрировать использование разработанного класса. ▪ Разработанный класс реализовать в трех вариантах: в одном файле, с выделение класса в файл с расширением. h, с отделением интерфейса класса от его реализации.
Пример решения задачи Разработка алгоритма решения Алгоритм программы линейный Описание структуры класса. Описание полей класса Начнем разработку класса с выбора типа данных для его полей. В соответствии с заданием наш класс должен иметь следующие поля: Название. Школа. Количество монахов. Площадь земли. Название. Тип этого поля необходимо определить как char * , так как это позволит размещать строки различной длины, не обращая внимания на возможность выхода за границы массива char[. . . ]. Школа. Данное поле будет хранить всего лишь один символ, поэтому его тип мы определим как char *. Количество монахов. Для хранения данных данного поля достаточно типа int и так эти данные, не могут принимать отрицательные значения, то для исключения ошибок тип определим как unsigned int. Площадь земли. Тип данного поля определим однозначно - float. Итак, таким образом, мы имеем класс с элементами данных (полями): сlass church { char *name; //Название char school; //Школа unsignedint count; //Количество монахов float square; //Площадьземли }
Пример решения задачи Функции-аксессоры В соответствии с условиями задания наш класс должен иметь три метода-аксессора: set() get() show() Начнем с метода set(). Ее задача - считать данные, вводимые пользователем с клавиатуры, и записать их в поля класса. Определим переменные , типы которых соответствуют типам полей класса: char *n; //Название char t; //Школа unsigned int s; //Количество монахов float h; //Площадь земли Форма определения переменных поле_класса=пределенная_переменная Определим метод get() - отвечает за считывание значений из полей класса. Для записи этих значений нам опять подойдут переменные, определенные выше. Форма записи будет выглядеть следующим образом: определенная_переменная = поле_класса. Необходимо обратить внимание на то, что для корректной работы с символьным полем требуется освободить память, занимаемую переменной, а затем выделить память под строку размером с длину строки, хранящейся в символьном поле класса. Это позволит добиться корректного отображения строк на экране и их правильного сохранения в переменной. Например: delete [] a; // освобождаем память, занимаемую переменной а a=newchar [strlen(name)+1]; // выделяем память под строку Третий метод - аксессор show() производит вывод на экран значений полей класса и ее реализация не
#include "stdafx. h" #include <iostream> #include <stdlib. h> #include<conio. h> #include <string. h> #include <iomanip> #include <windows. h> #include <locale. h> #define N 3 using namespace std; class church { char *name; // все элементы данных private – по умолчанию char school; unsigned int count; float square; public: void set(char *a, char b, unsigned int c, float d); void get(char *a, char &b, unsigned int &c, float &d); void show(void); }; //конец класса void church: : set(char *a, char b, unsigned int c, float d) { name=new char[]; strcpy(name, a); // name=a; school=b; count=c; square=d; } void church: : get(char *a, char &b, unsigned int &c, float &d) { delete [] a; a=new char [strlen(name)+1]; strcpy(a, name);
Конструкторы и деструкторы Конструктор – особая функция, являющаяся членом класса и позволяющая инициализировать объекты в момент их создания. Ее имя должно совпадать с именем класса. В объявлении конструктора не указывается тип возвращаемого знания, так как они не могут возвращать значения Конструктор автоматически вызывается в момент создания объекта, т. е. при его объявлении. Для глобальных и статистических локальных объектов конструкторы вызываются лишь однажды. При объявлении локальных объектов конструкторы вызываются каждый раз при входе в соответствующий блок Деструктор – антипод конструктора, который вызывается автоматически при разрушении объекта Имя деструктора совпадает с имнем конструктора, но перед ним ставится знак ∼ (тильда)
} void church: : get(char *a, char &b, unsigned int &c, float &d) { delete[] a; a=new char [strlen(name)+1]; strcpy(a, name); b=school; c=count; d=square; } void church: : show(void) { cout<<name<<" "; cout<<school<<" "; cout<<count<<" "; cout<<square<<" "; } int main() setlocale(lc_all, "rus"); сhar *n=new char[100]; char t; unsigned int s; float h; short i; church obj[n cout<<"результат работы конструктора по умолчанию: n"; for (i=0; i<n; i++) { obj[i]. show(); cout<<"n"; } cout<<"nрезультат работы конструктора с указанием параметров: n";
Связь между структурами и классами Структура – наследие языка С Отличие: в языке С++ все члены структуры по умолчанию считаются открытыми, а все члены класса – закрытыми В языке С++ структура – разновидность класса
Пример использования структуры вместо класса struct mystr{ void buildstr(char *s); // открытый член void showstr(); private: char str[255]; }; void mystr: : buildstr(char *s){ if (!*s) *str=‘ ’; // инициализация строки else strcat(str, s); } void mystr: : showstr() { cout << str << ″n″ ; } int main(){ mystr s; s. buildstr(″″); s. buildstr(″всем″); s. buildstr(″привет!″); s. showstr();
Связь между объединениями и классами В языке С++ объединения могут содержать не только данные, но функции конструкторы и деструкторы Объединения могут сохранять все свойства языка С, их члены могут размещаться в одной и той же области памяти Отличие: в языке С++ все члены объединения по умолчанию считаются открытыми, и полностью совместимы с языком С Ограничения: Объединения не могут использовать механизм наследования Объединение не может служить базовым классом Не может содержать: виртуальные функции; статистические переменные и ссылки; объекты классов, в которых перегружен оператор присваивания; объекты классов, в которых явно заданы конструктор и деструктор
Безымянные объединения Не имеют типа и не могут образовывать объекты Сообщают компилятору, что его члены хранятся в одной области памяти Доступ к таким переменным осуществляется непосредственно, без помощи оператора ‘. ’ int main(){ union { long l; double d; }; l=100; d=12. 3; cout << d<< “”; return 0; }
Дружественные функции С помощью ключевого слова friend можно предоставить обычной функции доступ к закрытым членам класса. Дружественная функция имеет доступ ко всем закрытым и защищенным членам класса Объявление дружественной функции – прототип функции помещается внутри класса, указав перед ней ключевое слово friend Дружественная функция не является членом класса, поэтому при ее вызове не нужно указывать имя объекта и использовать оператор ‘. ’
Пример дружественной функции #include <iostream> using namespace std; class myclass { int a, b; public: friend int sum (myclass x); void set_ab (int i, int j); }; void myclass: : set_ab(int i, int j) { a = i; b = j; } int sum (myclass x) { return x. a + x. b;
Преимущества и ограничения использования дружественных функций Преимущества: позволяют перегружать некоторые виды операторов облегчают создание некоторых функций вводавывода полезны, когда несколько классов могут содержать члены, тесно связанные с другими частями программы Ограничения: производный класс не наследует дружественные функции не могут содержать спецификатор хранения (static, extern)
Дружественные классы Один класс может быть дружественным по отношению к другому Дружественный класс и все его функции-члены имеют доступ к закрытым членам, определенным в другом классе Дружественные классы редко используются в практических приложениях
Пример дружественного класса #include <iostream> using namespace std; class myclass { int a; int b; public: myclass (int i, int j) { a = i; b = j; } friend class Min; }; class Min { public: int min (myclass x); } int Min: : min(myclass x) {
Подставляемые функции широко используются в классах Короткая функция, которая не вызывается, а подставляется в соответствующее место программы Перед подставляемой функцией указывают ключевое слово inline Использование подставляемых функций ускоряет работу программы, но увеличивает размер кода Подставляемые функции должны быть маленькими В некоторых случаях компилятор может проигнорировать подставляемые функции Рекурсивные функции не могут быть подставляемыми
Пример подставляемой функции #include <iostream> using namespace std; inline int min(int a, int b) { return a < b ? a : b ; } int main() { cout << min(10, 20); cout << “ “ << min(99, 88); return 0; } С точки зрения компилятора эта программа выглядит #include <iostream>
Пример подставляемой функции – члена класса #include <iostream> using namespace std; class myclass { int a; int b; public: void init (int i, int j); void show(); }; inline void myclass : : init (int i, int j) { a = i; b = j; } inline void myclass : : show() { cout << a << “ “ << b << “n”; } int main() { myclass x; x. init(10, 20) x. show(); return 0; }
Определение подставляемой функции внутри класса #include <iostream> using namespace std; class myclass { int a; int b; public: void init (int i, int j) { a = i; b = j; } void show() { cout << a << “ “ << b << “n”; } }; int main()
Конструкторы с параметрами Конструкторам можно передавать аргументы, предназначенные для инициализации объекта #include <iostream> using namespace std; class myclass { int a; int b; public: myclass (int i, int j) { a = i; b = j; } void show() { cout << a << “ “ << b << “n”; } }; int main() { myclass x (3, 5); // можно myclass x = myclass (3, 5); x. show(); return 0; }
Конструкторы с одним параметром Конструкторам можно передавать аргументы, предназначенные для инициализации объекта #include <iostream> using namespace std; class myclass { int a; public: myclass (int i) { a = i; } int geta { return a; } }; int main() { myclass x = 3; // передает параметру i значение 3 cout << x. geta(); // выводит на экран 3 return 0; }
Операторы ввода и вывода языка С++ Оператор ввода данных любого типа >> cin – идентификатор, связанный с клавиатурой Оператор вывода данных << cout – идентификатор, связанный с экраном Пример float a; int b; char str[10]; cout << введите два числа; cin >> a >> b; cout << введите строку; cin >> str; cout << “a= “<< a << “ “ << “b = “<< b << “ “ << str;
Модуль 3.1. Обзор языка С++.pptx