Файл: Основные понятия объектно-ориентированного программирования).pdf

ВУЗ: Не указан

Категория: Курсовая работа

Дисциплина: Не указана

Добавлен: 22.05.2023

Просмотров: 1698

Скачиваний: 3

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Аналогично языку программирования С, для подключения библиотек используется директива #include. Всего в стандарте языка C++ определено больше 50 таких файлов.

Библиотека STL до внесения ее в стандарт языка программирования C++ была сторонней разработкой фирм HP и SGI. Принятый стандарт языка не называет
ее термином STL, поскольку она стала неотъемлемой частью С++, однако разные программисты используют это название до сих пор, чтобы отличать ее от остальных частей стандартной библиотеки.

Изучение любого иностранного языка начинается с алфавита. Именно
из элементов алфавита состоят слова, конструкции и выражения, которые
в итоге образуют осмысленный текст. Применим этот принцип и к языку С++.

Стандарт языка С++ разделяет алфавит на четыре части: основной набор текстовых символов, множество универсальных символов, основной набор управляющих символов и основной набор расширенных управляющих символов.[3]

В свою очередь, на их основе создается набор управляющих символов и набор расширенных управляющих символов. Рассмотрим каждый из них подробнее.

Основной набор текстовых символов состоит из 96 символов: пробел, четырех управляющих символов (горизонтальная табуляция (\t), вертикальная табуляция (\v), перевод страницы (\f), переход на новую строку (\n) и символов ASCII (American Standard Code for Information Interchange – американский стандартный код для информационного обмена) – 91 символ. [1]

Как правило, этих символов вполне достаточно для создания практически любой программы.

Универсальные символы кодируются последовательностями
из четырех или восьми шестнадцатеричных цифр, называемых универсальными именами (universal-name-symbol).

/ Uhhhhhhhhh

/ uhhhh

Здесь символ h обозначает шестнадцатеричную цифру.[7]

Кроме символов, используемых для кодирования элементов программ (идентификаторов, комментариев, литералов и т.п.), в языке С++ используются так называемые управляющие символы, с помощью которых можно выполнять небольшое количество операций, связанных, как правило, с вводом и выводом данных.

Если программисту не важно, как завершена программа,
и он не предусматривает определенной реакции операционной системы, перед именем main() следует поставить ключевое слово void. Для того чтобы вернуть управление операционной системе можно или выполнить оператор return, или дождаться, пока поток управления достигнет последней фигурной скобки.[9]

Тривиальная программа, рассматриваемая выше, конечно, является исключением. Каждая реальная программа выполняет, по крайней мере, операции ввода и вывода, а для этого ей нужны стандартные функции, входящие
в процедурную систему ввода-вывода языка С, или операторы, которые являются частью объектно-ориентированной системы ввода-вывода языка С++ . Чтобы использовать эти функции и операторы, необходимо включить в программу заголовочный файл <stdio.h> или заголовок <iostream>.


Для этого в директиве #include указывается имя соответствующего заголовочного файла, заключенное в угловые скобки.[6]

Препроцессор – это программа, которая обрабатывает текст программы
на первом этапе компиляции. Она выполняет макроподстановку, условную компиляцию и включение именуемых файлов. Каждая из этих операций кодируется в виде особого оператора (директивы), начинающийся символом #. Как правило, препроцессор используется для включения в программу файлов, в которых определены стандартные функции.

Препроцессор не выполняет синтаксический анализ текста. Он просто распознает макроподстановки и выполняет их.[2]

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

3. СОЗДАНИЕ ПРОГРАММНОГО ПРОДУКТА С ПОМОЩЬЮ ОБЪЕКТНО-ОРИЕНТИРОВАННОГО ЯЗЫКА ПРОГРАММИРОВАНИЯ С++

3.1.Практическое применение шаблонов классов в С++

Шаблон класса - это обобщенное определение класса, которое содержит типы данных в качестве параметров, с которого компилятор автоматически создает класс для заданных пользователем типов данных. Когда компилятор создает по шаблону класса конкретный класс для определенных пользователем типом данных, говорится, что он создал шаблонный класс. В связи с этим шаблон класса называют иногда родовым классом.[2] Синтаксис объявления шаблона класса имеет следующий вид:[5]

template <class T1 | T1 идент1>,

class T2 | T2 идент 2,

...

class Tn | Tn идент n>

class имя_класса

{

// Тело класса

}

По ключевому слову template идет один или несколько параметров
в угловых скобках и разделенных между собой запятыми. Каждый параметр является:[1]

– или ключевым словом class, за которым следует имя типа;

– или именем типа, за которым следует идентификатор.

После этого идет объявления класса. Объявления и инициализация класса используют список параметров шаблона. Для задания параметризованных типов данных вместо ключевого слова class в угловых скобках может также использоваться ключевое слово typename. Как и в случае шаблонных функций, ключевое слово class или typename показывает, что параметр задает или встроенный, или определенный пользователем тип данных.


Параметры шаблона, которые идут по ключевому слову class
или typename, называют параметризованным типами. Параметры шаблона, которые состоят из имени типа и следующего за ним идентификатора, информируют компилятор о том, что параметром шаблона является константа указанного типа.
В связи с этим параметры называются нетипичными. Имя формального параметра
в списке параметров шаблона класса должно быть уникальным. Функции-члены шаблона класса могут определяться в теле класса (то есть как встроенные) или вне тела класса. [10]

Таким образом, список параметризованных типов и нетипичных констант указывается дважды. Первый раз - после ключевого слова template, он указывается точно так же, как при объявлении шаблона. Второй раз - после имени класса - он указывается снова в угловых скобках, но на этот раз перечисляются только параметризованные типы и нетипичные константы.[2]

Во всем остальные определения функции-члену не отличаются
от обычного. Если необходимо объявить функцию-член статической
или встроенной, то модификатор указывается по списку параметризованных типов и нетипичных констант перед типом функции, который возвращается.

Стоит отметить, что невозможно определить внутренний шаблонный класс
в теле другого шаблонного класса, но ничто не мешает вам использовать ранее объявленный шаблонный класс при объявлении и определении другого. Рассмотрим в качестве примера определения класса для обобщенного связного списка, который предназначен для работы с определенным пользователем типом данных:

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

• каждый параметр типа class T заменяется именем действительного типа;

• каждый параметр типа Type идент заменяется константным выражением.

Фактические аргументы для нетипичных параметров должны исчисляться
на стадии компиляции, поскольку именно на этой стадии проводится конкретизация шаблонных классов. [3]

В шаблонном классе можно объявлять статистические данные-члены. В этом случае для каждой конкретизации шаблонного класса будет построена своя совокупность статических данных-членов.

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


Шаблоны предоставляют определенные преимущества
при программировании, связанные с широкой применимости кода и легким его сопровождением. В общем, этот механизм позволяет решать такие задачи, для которых используется полиморфизм. С другой стороны, в отличие от макросов, они позволяют обеспечить безопасное использование типов данных. Однако
с их использованием связаны и некоторые недостатки:

• программа содержит полный код для всех порожденных представителей шаблонного класса или функции;

• не для всех типов данных предусмотрена реализация класса или функции оптимальна.

Преодоление второго недостатка возможно с помощью специализации шаблона.

3.2. Реализация программного продукта «Матричная арифметика»
с помощью шаблонного класса

Напишем шаблонный класс на языке С++, реализующий матричную арифметику: сложение, вычитание, умножение, транспонирование матриц, умножение матрицы на число, умножение вектора на матрицу, вывод элементов матрицы на дисплей, проверка матриц на равенство, нахождение определителя матрицы, нахождение следа матрицы.

Разработаем и реализуем тестовое приложение с оконным интерфейсом, демонстрирующее работу с описанным классом.[8]

С помощью среды интегрированной разработки C++ Builder создадим оконный интерфейс для приложения (рисунок 1)

Рисунок 1 – Проектирование интерфейса для программы «Матричная арифметика»

Реализация программы состоит из файла Matrix.cpp, в котором находится описание шаблонного класса и все его функций и модуля с основной программой.

Рассмотрим кратко основные части кода реализации шаблонного класса.

//Объявление шаблонного класса

template<class T>

class Matrix {

//Описание открытых полей класса

public:

//конструктор

Matrix(int n, int m) {

rows = n;

cols = m;

mtx = new T*[rows];

for(int i=0; i<rows; i++) {

mtx[i] = new T[cols];

}

}

//реализация конструктора копирования

Matrix(const Matrix<T> &m) {

rows = m.rows;

cols = m.cols;

mtx = new T*[rows];

for(int i=0; i<rows; i++) {

mtx[i] = new T[cols];

for(int j=0; j<cols; j++) {

mtx[i][j] = m.get(i,j);

}

}

}

//деструктор класса

~Matrix() {

if(mtx == NULL)

return;


for(int i=0; i<rows; i++) {

delete [] mtx[i];

}

delete [] mtx;

}

//функция для сложения матриц

Matrix<T> add(const Matrix<T> &m) {

//новая матрица

Matrix<T> res(rows, cols);

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

res.mtx[i][j] = get(i,j)+m.get(i,j);

}

}

return res;

}

//функция для вычистания матриц

Matrix<T> substract(const Matrix<T> &m) {

//новая матрица

Matrix<T> res(rows, cols);

for(int i=0; i<rows; i++) {

for(int j=0; j<cols; j++) {

res.mtx[i][j] = get(i,j)-m.get(i,j);

}

}

return res;

}

//функция для транспонирования матрицы

void transp() {

for(int i=0; i<rows; i++) {

for(int j=i; j<cols; j++) {

T tmp = mtx[i][j];

mtx[i][j] = mtx[j][i];

mtx[j][i] = tmp;

}

}

}

Остальные функции приведены в приложении А.

Функционирование программы показано на рис. 2:[4]

Рисунок 2 – Интерфейс программы

ЗАКЛЮЧЕНИЕ

В наше время, когда усиливается связь между миром коммерции и миром разработки программного обеспечения, и корпорации тратят много усилий
на планирование бизнеса, ощущается необходимость в соответствии абстрактных бизнес процессов их программным реализациям. К сожалению, большинство языков программирования реально не имеют прямого пути для связи бизнес-логики и кода. Основной причиной этого является низкая функциональность языка, а именно отсутствие поддержки объектно-ориентированного подхода.

Например, сегодня многие программисты комментируют свои программы
для объяснения того, какие классы реализуют какой-либо абстрактный бизнес объект. C++ позволяет использовать типизированные, расширяемые метаданные, которые могут быть прикреплены к объекту, различные шаблонные классы
и лямбда-функции.

Разработчик может программно проверить атрибуты какого-либо элемента.

В процессе выполнения работы были получены и закреплены практические навыки разработки программ с использованием шаблонных классов при написании программы в среде визуального программирования Borland C++ Builder 6.0.

В процессе написания курсовой работы были реализованы следующие задачи:

– рассмотрены основные определения и классификацию языков программирования;

  • раскрыты основные понятия для языка С;
  • охарактеризованы основные определения принципы объектно-ориентированного программирования;
  • рассмотрены понятие шаблона класса в С++;
  • рассмотрено технологию создания программ с помощью шаблонных классов.