Листинг 1: Пример класса стек




Пермский национальный исследовательский

Политехнический университет

Кафедра «Информационные технологии и автоматизированные системы»

Классы, стеки, наследование, полиморфизм

Выполнил(а): студент(ка) группы РИС-16-1б

Болилый В.С.

Проверил: доцент ИТАС

Полякова О.А.

 

 

Пермь, 2017


 

СОДЕРЖАНИЕ

 

 

Абстрактные типы данных 3

Инкапсуляция 4

Конструкторы и деструкторы 9

Перегрузка операций и дружественные функции 13

Наследование 17

Полиморфизм 21

Литература 27

 


 

Абстрактные типы данных

Абстракция данных — центральное понятие в разработке программ.

Абстракция определяет область и структуру данных вместе с набором операций, которые имеют доступ к данным.

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

ADT - формат

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

ADT ADT_Name

Данные

Описание структуры данных

Операции

Конструктор

Начальные значения: Данные, используемые для инициализации объекта

Процесс: Инициализация объекта

Операция1:

Вход: Данные от клиента

Предусловия: Необходимое состояние системы перед выполнением операций

Процесс: Действия, выполняемые с данными

Выход: Данные, возвращаемые клиенту

Постусловия: Состояние системы после выполнения операций

Операция2

* • •

Операцияn

* • •

Конец ADT

Инкапсуляция

Инкапсуляция (incapsulation) — это механизм, связывающий воедино код и данные, которыми он манипулирует, а также обеспечивающий их защиту от внешнего вмешательства и неправильного использования. В объектно-ориентированном языке код и данные можно погружать в “черный ящик”, который называется объектом (object). Иначе говоря, объект — это средство инкапсуляции.

Классы

Определения:

§ Класс является абстрактным типом данных, определяемым пользователем, и представляет собой модель реального объекта в виде данных и функций для работы с ними.

§ Данные класса называются полями, а функции класса — методами.

§ Поля и методы называются элементами класса.

Описание класса:

class <имя>{

[ private: ]

<описание скрытых элементов>

public:

<описание доступных элементов>

};

 

· Private и public - спецификаторы доступа, управляют видимостью элементов класса.

· Private - видимы только внутри класса. Используется по умолчанию.

· Public – вне класса, служит интерфейсом.

Действие любого спецификатора распространяется до следующего спецификатора или до конца класса.

Поля класса:

· Имеют любой тип, кроме того же класса.

· Модификаторы: const (инициализируются с помощью конструктора), static.

· Инициализация полей при описании не допускается.

Стек

Стек (stack) — это список элементов, организованных по принципу LIFO (last in — first out, последним пришёл — первым вышел). Элементы добавляются или удаляются из списка только в вершине (top) стека. Подносы в столовой или стопка коробок являются моделями стека.

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

ADT – формат стека

ADT Stack

Данные

Список элементов с позицией top, указывающей на вершину стека.

Операции

Конструктор

Начальные значения: Нет

Процесс: Инициализация вершины стека.

StackEmpty

Вход: Нет

Предусловия: Нет

Процесс: Проверка, пустой ли стек.

Выход: Возвращать True, если стек пустой, иначе возвращать False.

Постусловия: Нет

Pop

Вход: Нет

Предусловия: Стек не пустой.

Процесс: Удаление элемента из вершины стека.

Выход: Возвращать элемент из вершины стека.

Постусловия: Элемент удаляется из вершины стека.

Push

Вход: Элемент для стека.

Предусловия: Нет

Процесс: Сохранение элемента в вершине стека.

Выход: Нет

Постусловия: Стек имеет новый элемент в вершине.

Peek

Вход: Нет

Предусловия: Стек не пустой.

Процесс: Нахождение значения элемента в вершине стека.

Выход: Возвращать значение элемента из вершины стека.

Постусловия: Стек неизменный.

ClearStack

Вход: Нет

Предусловия: Нет

Процесс: Удаление всех элементов из стека и переустановка вершины стека.

Выход: Нет

Постусловия: Стек переустановлен в начальные условия.

Конец ADT Stack

 

Листинг 1: Пример класса стек

 

// pragma once - препроцессорная директива, разработанная для контроля за тем, чтобы конкретный исходный файл при компиляции подключался строго один раз.

 

#pragma once

#include <iostream>

namespace stk{

 

//тип стека (псевдоним типа)

typedef int DType;

//Макс. Размер стека

const int STACK_SIZE=20;

 

class Stack{

DType stck[STACK_SIZE];

int top;

public:

//Инициализация

void init();

// операции модификации стека

void push(const DType &item);

DType pop();

void clear();

 

// доступ к стеку

// функция не может модифицировать вызывающий ее объект.

DType peek (void) const;

 

// методы проверки стека

bool isEmpty() const;

bool isFull() const; // реализация массива

};

 

}

 

 

Пример реализации:

#include "stack.h"

 

namespace stk{

void Stack::init()

{

top = -1;

}

 

void Stack::push(const DType &item)

{

if (top == STACK_SIZE-1){

std::cerr << "Стек полон.\n";

return;

}

stck[++top] = item;

 

}

 

DType Stack::pop()

{

if (top == -1){

std::cerr << "Стек пуст.\n";

return 0;

}

return stck[top--];

}

 

void Stack::clear(void)

{

top = -1;

}

 

DType Stack::peek() const

{

if (top == -1)

{

std::cerr << "Стэк пуст!\n";

exit(1);

}

return stck[top];

}

 

bool Stack::isEmpty() const

{

return top == -1;

}

 

bool Stack::isFull() const

{

return top == STACK_SIZE-1;

}

}

 

Пример использования:

 

#include <iostream>

#include "stack_v0.h"

using namespace std;

 

int main(int argc, char *argv[])

{

system("chcp 65001");

stk::Stack stck;

stck.init();

for (int i=0; i< 3; i++)

stck.push(i+1);

 

cout << stck.peek() << endl;

 

for (int i=0; i< 3; i++)

cout << stck.pop() << endl;

 

return 0;

}

Результат:

Способы использования класса:

stk::Stack *pstck = new stk::Stack;

pstck->init();

pstck->push(10);

cout << pstck->pop() << endl;

Ошибки:

 

stk::Stack stck;

stck.top //Ошибка компиляции

Указатель this

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

Пример:

Явно Не явно
void Stack::init() { this->top = 0; } void Stack::init() { top = 0; }

 

Классы могут быть глобальными и локальными.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2017-07-02 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: