- •Объектно-ориентированное программирование:
- •Содержание
- •Новый тип данных – класс
- •1.2. Доступность компонентов класса
- •1.3. Конструктор и деструктор
- •1.4.4. Статические члены класса
- •1.4. Компоненты-данные и компоненты-функции
- •1.4.1. Данные – члены класса
- •1.4.2. Функции – члены класса
- •1.4.3. Константные компоненты-функции
- •Указатели на компоненты класса
- •1.5.1. Указатели на компоненты-данные
- •1.5.2.Указатели на компоненты-функции
- •1.6. Указатель this
- •1.7. Друзья классов
- •7.1. Дружественная функция
- •1.7.2. Дружественный класс
- •1.8. Определение классов и методов классов
- •2. Наследование
- •2.1. Определение производного класса
- •2.2. Конструкторы и деструкторы производных классов
- •2.3. Виртуальные функции
- •2.4. Абстрактные классы
- •2.5. Включение объектов
- •2.6. Включение и наследование
- •2.7. Множественное наследование
- •2.8. Локальные и вложенные классы
- •2.9. Пример программы для Microsoft Visual Studio
- •2.10. Упражнения
- •3. Перегрузка операций
- •3.1. Перегрузка унарных операций
- •3.2. Перегрузка бинарных операций
- •3.4. Перегрузка операции вызова функции
- •3.5. Перегрузка операции присваивания
- •3.6. Перегрузка операции new
- •3.7. Перегрузка операции delete.
- •3.8. Основные правила перегрузки операций
- •3.9. Примеры программ
- •4. Шаблоны функций и классов
- •4.1. Шаблоны функций
- •4.2. Шаблоны классов
- •4.3. Компонентные функции параметризованных классов
- •4.4. Примеры программ.
- •5. Обработка исключительных ситуаций
- •5.2. Получение дополнительной информации об исключении
- •5.3. Определение типа исключения
- •5.4. Иерархия исключений
- •5.5. Спецификация функций, обрабатывающих исключения
- •6. Потоковые классы
- •6.1. Библиотека потоковых классов
- •6.3. Стандартные потоки ввода-вывода
- •6.4. Форматирование
- •6.5. Манипуляторы
- •6.6. Ввод-вывод объектов пользовательских классов
- •6.7. Определение пользовательских манипуляторов
- •6.8. Пользовательские манипуляторы с параметрами
- •6.9. Использование макросов для создания манипуляторов
- •6.10. Состояние потока
- •6.11. Неформатированный ввод-вывод
- •6.12. Файловый ввод-вывод
- •7.1. Пространство имен
- •7.2. Динамическая идентификация типов
- •7.3. Безопасное приведение типа
- •8. Стандартная библиотека шаблонов
- •8.1. Введение в stl
- •Парадигму обобщенного программирования можно сформулировать следующим образом:
- •8.2. Итераторы
- •8.3. Классы-контейнеры
- •Iterator find(const key_type&k)
- •Iterator lower_bound(const key_type&k)
- •Iterator upper_bound(const key_type&k)
- •8.4. Контейнер vector
- •8.5. Многомерные массивы
- •8.6. Ассоциативные контейнеры
- •8.7. Объекты-функции
- •8.8. Алгоритмы
- •I. Немодифицирующие операции
- •II. Модифицирующие операции
- •III. Сортировка
- •IV. Работа с множествами
- •V. Минимумы и максимумы
- •VI. Перестановки
II. Модифицирующие операции
copy() копирует последовательность, начиная с первого элемента
swap() меняет местами два элемента
replace() заменяет элементы с указанным значением
replace_if() заменяет элементы при выполнении предиката
replace_copy() копирует последовательность, заменяя элементы с указанным значением
replace_copy_if() копирует последовательность, заменяя элементы при выполнении предиката
fill() заменяет все элементы данным значением
remove() удаляет элементы с данным значением
remove_if() удаляет элементы при выполнении предиката
remove_copy() копирует последовательность, удаляя элементы с указанным значением
remove_copy_if() копирует последовательность, удаляя элементы при выполнении предиката
reverse() меняет порядок следования элементов на обратный
random_shuffle() перемещает элементы согласно случайному равномерному распределению («тасует» последовательность)
transform() выполняет заданную операцию над каждым элементом последовательности
unique() удаляет равные соседние элементы
unique_copy() копирует последовательность, удаляя равные соседние элементы
III. Сортировка
sort() сортирует последовательность с хорошей средней эффективностью
partial_sort() сортирует часть последовательности
stable_sort() сортирует последовательность, сохраняя порядок следования равных элементов
lower_bound() находит первое вхождение значения в отсортированной последовательности
upper_bound() находит первый элемент, больший, чем заданное значение
binary_search() определяет, есть ли данный элемент в отсортированной последовательности
merge() сливает две отсортированные последовательности
IV. Работа с множествами
includes() проверка на вхождение
set_union() объединение множеств
set_intersection() пересечение множеств
set_difference() разность множеств
V. Минимумы и максимумы
min() меньшее из двух
max() большее из двух
min_element() наименьшее значение в последовательности
max_element() наибольшее значение в последовательности
VI. Перестановки
next_permutation() следующая перестановка в лексикографическом порядке
pred_permutation() предыдущая перестановка в лексикографическом порядке
Пример 8.8.1. Сортировка массива данных встроенных типов
Алгоритм sort() имеет следующие основные формы.
template<class RandIter>
void sort(RandIter начало,RandIter конец)
template<class RandIter,class Comp>
void sort(RandIter начало,RandIter конец,
Comp функция_сравнения)
В примере создается и сортируется массив символов.
#include<iostream>
#include<vector>
#include<cstdlib>
#include<algorithm>
using namespace std;
void main()
{vector<char> v;
int i,k;
cin>>k;
//создание векторов из случайных символов
for(i=0;i<k;i++)
v.push_back(‘A’+(rand()%26));
//исходный массив
for(i=0;i<v.size();i++)cout<<v[i];
cout<<endl;
//сортировка вектора
sort(v.begin(),v.end());
//отсортированный массив
for(i=0;i<v.size();i++)cout<<v[i];
cout<<endl;
}
Пример 8.8.2. Сортировка массива данных пользовательских типов
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include <functional>
#include“student.h” //Определение класса STUDENT
using namespace std;
Определим функцию для сравнения студентов по рейтингу
class pred : public binary_function< STUDENT, STUDENT,bool>
{
public:
bool operator()(const STUDENT& st1, STUDENT& s2)const
{return s1.GetGrade()<s2.GetGrade();}
};
В функции main() запишем
vector< STUDENT> v;
Затем надо заполнить контейнер v, например так:
v1.push_back(STUDENT ("Иванов",19,54.5));
Если сейчас отсортировать контейнер следующим образом:
sort(v.begin(),v.end());
то студенты будут отсортированы в зависимости от того, как определена в классе STUDENT опрерация <.
Если мы хотим отсортировать контейнер нужным для нас образом, следует использовать объект-функцию. Например, определим функцию для сравнения студентов по рейтингу:
class pred : public binary_function< STUDENT, STUDENT,bool>
{
public:
bool operator()(const STUDENT& st1, STUDENT& s2)const
{return s1.GetGrade()<s2.GetGrade();}
};
Сортируем контейнер
sort(v.begin(),v.end(),pred());
При передаче алгоритму sort третьего параметра создается объект класса pred (вызовом контейнера без конструктора) и вызывается перегруженная операция ().
Пример 8.8.3. Поиск в контейнере
Создадим фунциональный класса для поиска по имени:
class pred1:public unary_function< STUDENT,bool>
{
string s;
public:
explicit pred1(const string& ss):s(ss){}
bool operator()(const STUDENT & ob)const
{return ob.Get_Name()==s;}
};
После этого для поиска можно использовать алгоритм find_if:
vector<STUDENTt>::iterator it;
it= find_if(v1.begin(),v1.end(),pred1("Котов"));
После выполнения find_if следует проверить, найден ли объект. Вспомним, что в случае неудачи алгоритм возвращает значение функции end().
if(it!=v1.end())cout<<endl<<*p<<endl;
else cout<<"Такого объекта нет"<<endl;
Приложение. Создание С++ приложений в среде Microsoft Visual Studio
Концепция решений и проектов
Сеанс работы в Microsoft Visual Studio.Net начинается с открытия существующего или создания нового решения(solution). Решение – это синоним рабочего пространства(workspace) в Microsoft Visual C++ 6.0. Файлы решений имеют расширение sln и используются IDE для хранения настроек и начальных установок конкретных решений. Концепция решений помогает объединить проекты и другие элементы в одном рабочем пространстве. Рабочее пространство может содержать несколько проектов, быть пустым или содержать файлы, которые имеют смысл и вне контекста решений. Проект как часть решения состоит из отдельных компонентов, например файлов ресурсов(rc-файл), файлов с исходными кодами(.cpp, .h). Настройки проектов хранятся в специальных файлах проектов. Они могут иметь разные расширения, так как в одном пространстве можно объединять проекты разных типов. Например, проект Win32 Aplication хранит свои установки в файле с расширением vcproj.
Создание нового проекта
После запуска Visual Studio появится следующее окно(рис. 1)
рис. 1
В этом окне выберем в меню File команду New->Project, либо нажмем Ctrl+Shift+N.
В появившемся окне New Project в списке Project type выберем Visual C++/Win32, а в списке Templates – Win32 Console Application (рис. 2). В строке name введем имя проекта, а в строке Location выберем расположение проекта.
Если Вы хотите создать папку для решения (solution), то следует отметить “Create directory for solution” и ввести имя решения в строке “Solution Name”.
рис. 2
Нажав кнопку OK, перейдем в Мастер Приложения(рис.3).
рис. 3
Нажмем кнопку “Next” и перейдем в окно установки параметров проекта (рис. 4).
рис. 4
В этом окне выберем Console application и Empty project. Нажмем кнопку “Finish”. Мастер создаст проект – консольное приложение.
В окне проекта (рис. 5) мы видим три раздела: Object Browser, Solution Explorer и Resourse View. В окне Solution Explorer можно осуществлять навигацию по файлам проекта. В этом окне мы видим имя проекта(lab1) и три группы файлов(Header Files, Resource Files и Source Files). Пока проект не содержит файлов. Создадим необходимые файлы. Для этого в окне Solution Explorer щелкнем правой кнопкой мыши по проекту и в появившемся контекстном меню выберем Add/New Item… .
рис. 5
В появившемся окне Add New Item (рис. 6) в списке Categories выберем Code, а в списке Templates – тип добавляемого в проект файла.
рис. 6
Создадим три файла: country.h – определение класса, country.cpp – реализация класса и main.cpp – демонстрационная программа, содержащая функцию main(). Пока файлы пустые. Щелкнул по имени файла, мы перейдем в редактор кода, где и запишем соответствующий код(рис.7).
рис. 7
Для того, чтобы откомпилировать и собрать проект(создать выполняемый exe-файл, щелкните правой кнопкой мыши по проекту и в появившемся контекстном меню выберите Build, Rebuild или Debug/Start new instance. То же самое можно сделать через меню Build и Debug или нажав Ctrl+F5. Результаты выполнения проекта увидим на вкладке Output(рис. 8). Если программа содержит ошибки, получим сообщение типа показанного на рисунке.
рис. 8
Щелкнув по сообщению об ошибке(рис. 9), мы перейдем к месту ошибки в коде программы(рис. 10).
рис. 9
рис. 10
На рисунке 11 показаны сообщения при успешной компиляции и компоновки программы.
рис. 11
Установить конфигурацию проекта (Debug или Release) можно через меню Build/Configuration Menager(рис. 12).
рис. 12
