Главная страница

Программирование C++. Пензенский государственный университет введение в программирование на языке с лабораторный практикум пенза 2010 г 2


Скачать 1.47 Mb.
НазваниеПензенский государственный университет введение в программирование на языке с лабораторный практикум пенза 2010 г 2
Дата06.10.2022
Размер1.47 Mb.
Формат файлаpdf
Имя файлаПрограммирование C++.pdf
ТипПрактикум
#718990
страница7 из 10
1   2   3   4   5   6   7   8   9   10

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

54
4. КЛАССЫ И ОБЪЕКТЫ Подход к разработке программных средств, в основе которого лежит объектная декомпозиция программной системы, получил название объектно- ориентированного. Объектная декомпозиция заключается в представлении программной системы в виде совокупности классов и объектов, которые наиболее естественным образом отражают предметную область работы системы. При этом иерархический характер системы отражается в иерархии классов, а ее функционирование рассматривается как взаимодействие объектов этих классов. Объект обладает индивидуальностью и поведением. Индивидуальность объекта, его свойства это значения атрибутов (данных, которые определяют его состояние. Поведение – это совокупность методов (функций, определяющих взаимодействие объекта с "внешней" средой и изменяющих его состояние. Таким образом, объект объединяет данные (свойства) и код (поведение) в единое целое. Каждый объект является представителем некоторого класса. Класс – это совокупность однотипных объектов. Класс определяет общие свойства для всех его объектов. Графическое изображение класса в нотации языка
UML (Unified
Modeling Language)
следующее (рисунок 4.1): Имя класса
Свойства
(
данные)
Методы
(
функции)
Рисунок 4.1 – Графическое представление класса Таким образом определение класса включает
class
имя_класса
// Определение класса
{
// Член класса может быть
//
private
(закрытый)
– доступный только внутри методов и

//
друзей этого класса
//
protected
(защищенный)
– доступный только внутри методов, друзей этого
//
класса и производных от него классов
//
public
(открытый)
– доступный из произвольной программной среды
// Данные
private
: объявление данных Методы
public: объявление и определение функций
} ;
// Определение класса завершается символом точка с запятой

55
Объектно-ориентированной разработке присущи следующие характерные свойства классов и объектов инкапсуляция – объединение данных и кода водно целое. Скрытие информации – имеется возможность запретить любой доступ к данным объекта, кроме как через его методы. Внутренняя структура объекта скрыта от пользователя наследование – возможность создавать новые классы по принципу "от общего к частному. Наследование позволяет классам- потомкам при сохранении всех свойств классов- родителей добавлять свои собственные свойства, которые отражают их индивидуальность полиморфизм способность объектов выбирать реализацию метода на основе типов данных, принимаемых в сообщении. Объекты разных классов реагируют по- своему на одно и тоже сообщение. Это позволяет разным объектам иерархии классов реализовать своим собственным образом некоторый метод обработки данных (с одними тем же именем для всех объектов. Пример Класс Вектор Файл vector.h

// определение класса вектор,
// его данных и методов _VECTOR_H предотвращение многократного
#define
_VECTOR_H включения заголовочного файла
#include

using
std::endl;
using
std::cout;
class
VECTOR
// Класс для работы с геометрическими векторами
{ Данные
private
:
int
x, y;
// координаты конца вектора Методы
public
:
// Присвоить значения координатам вектора подставляемый метод -
// определение метода дано в определении класса
void
Assign(
const
int
&x1,
const
int
&y1 )
{
x = x1; y = y1;
return
;
}
// Печать значений координат вектора объявление метода класса.
// Определение будет дано далее.
void
print(
void
)
const
;
};
// завершение определения класса
// Определение метода
print
класса
VECTOR
void
VECTOR::print(
void
)
const
//
const в конце заголовка метода – метод не может изменить данные класса
{
cout<<
"\n Coordinates of a vector: x= "
<
" y= "
<
return
;
}
#endif
_VECTOR_H

56 Файл class_vector.cpp использование класса Вектор"

const
int
N = 5;
// Число векторов в массиве
int
main()
{
// Создаем вектор v1 - объект класса VECTOR
// и массив векторов v_a - массив объектов класса VECTOR
VECTOR
v1, v_a[ N ];
// Инициализируем и печатаем вектор v1
v1.Assign( 0, 0); cout<<
"\n Vector v1: "
; v1.print( );
// Инициализируем и печатаем массив векторов v_a
for
(
int
i = 0; i < N; i++ )
{
v_a[i].Assign( i, i+1 );
cout<<
"\n Vector v_a["
<
"]:"
;
v_a[i].print( );
}
cout<
system(
"pause"
);
return
0; Результат работы программы Для того, чтобы использовать объекты, как значения типа, объявленного разработчиком программы, класс должен обладать механизмом создания и уничтожения объектов. Таким механизмом являются конструкторы и де стр ук торы объектов. Если класс не имеет конструктора, то инициализировать его объект при помощи списка значений (как структурную переменную) можно только в том случае, если все данные класса открытые Конструкторы и деструкторы Конструктор – это метод (функция, имя которого совпадает с именем класса. Конструктор создает и инициализирует объект класса. Конструктора в томат и чески вызывается при создании объекта на первом этапе инициализируется конструктор, на втором – тело конструктора. Конструкторов может быть несколько, при этом каждый конструктор со своим индивидуальным списком параметров. Конструктор по умолчанию конструктору которого отсутствуют параметры. Конструктор копирования конструктор, который вызывается когда создается объект класса с инициализацией другим объектом когда объект передается в функцию как параметр по значению или когда метод класса возвращает в операторе значение объекта. Конструктор НЕ воз р а щ а е т значения Например, создание объекта класса
VECTOR с помощью конструктора можно описать так VECTOR
{ Данные
private
:
int
x, y;
// координаты конца вектора Методы
public
:
// Конструктор по умолчанию, без параметров.
// Подставляемый метод
VECTOR () {x = 0; y = 0;}
// Конструктор с параметрами и инициализацией данных класса
// значениями соответствующих параметров.
// При этом создание и инициализация объекта осуществляются
// на первом этапе работы конструктора второй этап отсутствует

// тело конструктора пусто
VECTOR (
const
int
&x1,
const
int
&y1 ) : x (x1), y (y1){ }
// можно итак (но при этом создание и инициализация объекта
// осуществляются в два этапа работы конструктора
//
VECTOR ( const int &x1, const int &y1 ) { x = x1; y = y1; }
// Конструктор копирования - вызывается при создании
// нового объекта с инициализацией другим объектом.
// Подставляемый метод
VECTOR (
const
VECTOR © ) объект
copy
- источник копирования
{
x = copy.x; y=copy.y;
}
. . .
};

58 При объявлении векторов, как в примере 4_1:
VECTOR v1, v_a[ N ];
– конструктор по умочанию будет вызван
6
раз (один раз для
v1 и по одному разу для каждого элемента массива
v_a
). Все созданные объекты будут инициализированы нулевыми значениями. Если используется определение
VECTOR v1 (10, 10)
– то вызывается конструктор с параметрами и создается вектор с координатами
x = 10, y = В случае определения
VECTOR v2 (v1)
вызывается конструктор копирования и создается вектор
v2 с координатами
v1.x, Конструктор по умолчанию и конструктор с параметрами можно объединить в один конструктор. Например, для рассматриваемого класса
VECTOR
:
VECTOR (
const
int
&x1=0,
const
int
&y1=0 ) : x(x1), y(y1) { } Если конструктор копирования не создан разработчиком программы, то автоматически создается конструктор с поверхностным копированием. В случае с динамическими объектами копируется только указатель на объекта копия объекта в динамической памяти нес о з дается, что приводит кн е правильной работе программы Для примера 4_1 собственный конструктор копирования можно не создавать.
Деструктор
– это метод (функция, имя которого совпадает с именем класса и начинается с символа

(тильда. Деструктор предназначен для уничтожения объектов. Если конструктор не выполняет динамическое распределение памяти, то собственный деструктор кодировать не надо. Де стр ук тор вызывается неявно когда объект класса выходит из области видимости (как переменная. Де стр ук тор всегда только один, НЕ имеет параметров и НЕ воз р а щ а е т значения Перегрузка операций для классов Для того, чтобы сделать работу с объектами удобной и сответствующей предметной области использования объектов,
С++
предоставляет возможность перегрузки стандартных операций для объектов пользовательских типов. Для этого следует разработать специальный метод класса (функцию-операцию)
operator. Прототип такого метода в определении класса следующий тип
operator
знак_операции (список_параметров); Перечислим некоторые правила перегрузки операций можно перегружать любые операции С, за исключением
«.», «.*», «?:», «::», не допускается перегрузка операций для стандартных (определенных в С) типов данных нельзя изменять синтаксис операций. Например, операция
++
перегружается как унарная (имеющая один операнд, операция
+
может переружаться как унарная, таки как бинарная функции–операции не могут иметь параметры со значениями по умолчанию

59 при перегрузке бинарной операции перегружаемая функция, как метод класса, должна иметь один параметр. Вторым является неявный параметр – константный указатель
this
на текущий объект(левый операнд при перегрузке бинарных операций
+ - * / % ++ --
в большинстве случаев перегружаемая функция возвращает объект класса чтобы сохранить семантику присваивания, операция
=
должна перегружаться как функция, принимающая один параметр ссылку напр и сваи в а ем ы й объект класса, ив о з вращающая ссылку на объект класса, для которого она вызвана операция индексирования должна перегружаться как функция, возвращаящая ссылку на элемент из множества значений. Пример Класс Вектор с конструкторами и перегрузкой операций Файл vector1.h

// определение класса вектор,
// его данных и методов _VECTOR1_H предотвращение многократного
#define
_VECTOR1_H включения заголовочного файла
#include

using
std::endl;
using
std::cout;
class
VECTOR1
// Класс для работы с геометрическими векторами
{ Данные
private
:
int
x, y;
// Координаты конца вектора Методы
public
:
// Конструктор вызывается при создании нового объекта
// с инициализацией по умолчанию или значениями параметров
VECTOR1 (
const
int
&x1=0,
const
int
&y1=0 ) : x(x1), y(y1){ } можно итак Конструктор копирования - вызывается при создании
// нового объекта с инициализацией другим объектом,
// при передаче параметра с типом класса по значению и
// при возврате значения объекта с типом класса из
// метода класса по return.
// Подставляемый метод
VECTOR1 (
const
VECTOR1 © )
//copy - источник копирования
{
x = copy.x; y=copy.y;
}
// Присвоить значения координатам вектора подставляемый метод.
void
Assign(
const
int
&x1,
const
int
&y1 )
{
x = x1; y = y1;
return
;
}

60
// Перегрузка префиксного унарного оператора "++" с
// помощью метода класса прибавляет к вектору
// единичный вектор и возвращает сам вектор (не ссылку)
// Метод не имеет явно передаваемых аргументов, так
// как при вызове неявно получает адрес объекта (this),
// для которого он вызван. Подставляемый метод
VECTOR1
operator
++(
void
)
{
x++; y++;
return
*
this
;
// Возвращается сам вектор после увеличения
}
// Перегрузка постфиксного унарного оператора "++" с
// помощью метода класса возвращает значение
// вектора до прибавления единичного вектора. В
// методе "operator++( int )" параметр метода
// игнорируется. Метод является подставляемым
VECTOR1
operator
++(
int
)
{
VECTOR1 vec_tmp = *
this
;
x++; y++;
return
vec_tmp;
// Возвращает значение вектора до увеличения
}
// Перегрузка бинарного оператора "+" с помощью метода
// класса суммирует два вектора и возвращает их
// сумму (не ссылку. Модификатор const гарантирует, что данный метод
// не изменит значений членов объекта, для которого он вызван.
// Определение будет дано далее.
VECTOR1
operator
+(
const
VECTOR1 & )
const
;
// Перегрузка бинарной операции "=": подставляемый
// метод (при его наличии можно корректно
// использовать цепочки присваиваний.
// В примере этот метод можно было не записывать, так
// как в примере не используются цепочки присваиваний и
// нет полей указателей на области динамической
// памяти
VECTOR1&
operator
= (
const
VECTOR1 &v )
// Возвращает ссылку на объект
// this - левый операнд
// v
- правый операнд
{
this
->x = v.x;
this
->y = v.y;
// А можно итак Печать значений координат вектора объявление метода класса.
// Определение будет дано далее.
void
print(
void
)
const
;
};
void
VECTOR1::print(
void
)
const
{
cout<<
"\n Coordinates of a vector: x= "
<
" y= "
<
return
;
}

61
// Оператор "+" бинарный, поэтому метод "operator+"
// должeн иметь помимо скрытого (this) еще один явно
// передаваемый параметр
VECTOR1 VECTOR1 ::
operator
+(
const
VECTOR1 &vec )
const
{
// Создать вектор для получения суммы ив начале
// присвоить ему значение первого слагаемого
VECTOR1
vec_tmp = *
this
;
// Сложить векторы и возвратить результат
vec_tmp.x += vec.x; vec_tmp.y += vec.y;
return
vec_tmp;
сначала будет вызван конструктор копирования
vec_tmp
,
а затем деструктор для удаления
vec_tmp
}
#endif
_VECTOR1_H Файл class_vector1.cpp
1   2   3   4   5   6   7   8   9   10


написать администратору сайта