Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Теоретический материал, необходимый для выполнения домашнего задания



Описание работы с классами в языке программирования C++

Класс в C++ - это определяемый пользователем тип данных. Переменную, типом которой является класс, называют объектом (экземпляром) класса.

В случае динамического выделения памяти мы создаем экземпляр класса в момент вызова new. Может существовать множество указателей на один и тот же экземпляр класса. Копирование указателя не приводит к копированию экземпляра класса.

Это правило иллюстрируется кодом ниже:

TClass* ptr_class1 = new TClass; //создан экземпляр класса

TClass* ptr_class2 = ptr_class1; //копируется указатель – их 2, экземпляр 1

TClass class1;

TClass class2 = class1; //Копируется объект, создан второй экземпляр

Пользователь может задать поля данных класса и методы класса. Поля данных (у каждого из которых есть тип) – это значения, которые объект класса должен помнить внутри себя. Методы – это операции, которые могут быть выполнены с объектом класса.

Например, может существовать класс строки, выглядящий примерно так:

class TString

{

public:

TString();//Конструктор класса – создание строки

~TString();//Деструктор – разрушение строки

//Методы установки значения строки и поиска символа – доступны //пользователю

void Set(const char* ptr_string);

int Find(char symbol);

private:

//Освобождение памяти – только изнутри класса.

void ReleaseMemory();

private:

char* ptr_Buffer;//Указатель на начало строки

int BufferLength;//Длина выделенной по адресу ptr_Buffer памяти

};

//Что мы делаем, когда создается новая строка

TString::TString()

{

//Мы обнуляем указатель и длину - память не выделена

ptr_Buffer = 0;

BufferLength = 0;

}

//Разрушение строки

TString::~TString()

{

//Достаточно вызвать метод освобождения памяти

ReleaseMemory();

}

//Если у нас вызовут метод Set и передадут нам строку – что мы сделаем

void TString::Set(const char* ptr_string)

{

//Определим необходимую длину строки

int need_length = strlen(ptr_string) + 1;

if (need_length > BufferLength)

{

//при необходимости выделим нужный объем памяти

ReleaseMemory();

ptr_Buffer = new char[ need_length ];

BufferLength = need_length;

}

//Скопируем переданную строку в выделенную память.

strcpy(ptr_Buffer, ptr_string);

}

//Что делать, если вызван метод ReleaseMemory (освободить память)

void TString::ReleaseMemory()

{

//Освободить выделенную память и установить в 0 указатель и длину

delete[] ptr_Buffer;

ptr_Buffer = 0;

BufferLength = 0;

}

//Что делать, если нас попросили найти в строке символ

int TString::Find(char symbol)

{

//Вызвать стандартную функцию strchr и определить номер символа по

//возвращаемому ей указателю на символ

char* ptr_symbol = strchr(ptr_Buffer, symbol);

if (ptr_symbol)

return ptr_symbol - ptr_Buffer;

else

return -1;

}

int _tmain(int argc, _TCHAR* argv[])

{

TString string; //Создаем переменную типа TString

string.Set("Test"); //Устанавливаем ее значение

int pos1 = string.Find('s'); //Ищем символ

int pos2 = string.Find('a'); //Ищем символ

printf("%d %d", pos1, pos2);

getch();

return 0;

}

Функциональный и объектно-ориентированный подходы к программированию – краткое описание

Основные принципы функционального подхода к программированию следующие:

1. Мы задаем себе вопрос «Что программа должна сделать» и формулируем ответ на него.

2. После этого мы разбиваем то, что должна сделать программа, на логические этапы. Каждый логический этап представляется как подпрограмма (функция C++). Далее мы рассматриваем задачу каждой функции и бьем ее на более мелкие части, пока функции не станут элементарными.

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

4. Как правило, существующие в программе функции соответствуют глаголам постановки задачи.

Функциональный подход был достаточно органичным для программ научных расчетов и т.д. – программ, которые должны выполнить какую-то операцию и выйти.

Основы объектно-ориентированного проектирования следующие:

1. Мы задаем себе вопрос «с какими объектами работает наша программа?» Какие объекты реального мира она моделирует? Какими свойствами обладают эти объекты и какие операции могут с ними выполняться?

2. После этого мы создаем классы (возможные типы объектов), методы и члены данных.

3. Если реализация какого-то метода нетривиальна – обычно это говорит о необходимости промоделировать (более точно, чем раньше) тот или иной объект.

4. Как правило, существующие в программе классы соответствуют существительным постановки задачи.

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

В объектно-ориентрованной программе широко используются три принципа:

1. Инкапсуляция – объединение данных и методов в рамках класса и скрытие данных от пользователя (как правило, пользователь может вызвать лишь методы класса).

2. Наследование – возможность создать класс-потомок, содержащий функциональность класса предка + дополнительную функциональность. Актуально для случая, когда один класс более конкретен, чем другой. Например, «самолет» имеет все свойства и операции класса «транспортное средство» + дополнительные операции (потому что самолет – транспортное средство).

3. Полиморфизм. Позволяет наследнику определить реализацию метода, отличную от существующей в предке. При этом, если пользовательский код, работая с объектом класса-потомка, не знает конкретного типа объекта (думает, что это объект класса-предка), вызван все равно будет метод потомка. Например, если существуют классы геометрических фигур, унаследованные от класса Shape, и каждый из них имеет свою реализацию сдвига и поворота, то массив фигур может поворачиваться единообразно без знания реализации каждой фигуры.

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





Дата публикования: 2015-01-13; Прочитано: 230 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...