Объектно-ориентированное программирование 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Объектно-ориентированное программирование



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

1. Инкапсуляция. Комбинирование записей с процедурами и функциями, манипулирующими полями этих записей, формирует новый тип данных - объект.

2. Наследование. Определение объекта и его дальнейшее использование для построения иерархии порожденных объектов с возможностью для каждого порожденного объекта, относящегося к иерархии, доступа к коду и данным всех порождающих объектов.

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

 


43. С++. Классы.

Центральным понятие объектно-ориентированного программирования является понятие класса. Обобщенное определение класса как некоторого фрагмента предметной области может быть дано следующим образом: «Класс – множества объектов, связанных общностью структуры и поведения».

В языке С++ под классом понимается производный тип данных. Объединенный со множеством функций и операций. Работающих c объектами этого типа, и сформированный при помощи описателей class, struct или union. Синтаксис определения класса представляется так:

<описатель> имя_класса[: базовый_список]{<список_элементов>};

В этом определении <описатель> - один из описателей class, structили union, имя_класса - идентификатор; в базовом списке перечисляются базовый класс или классы, свойства которых наследуются, а <список_элементов> объявляет элементы класса - элементы данных и функции (методы) класса.

Самым простым примером описания класса может служить следующее объявление класса с описателем srtuct:

struct Line { int i; void SetColor(int);};

В примере объявлен класс графических прямых Line. Для определения объектов класса Line можно воспользоваться идентификатором Line как описателем типа: Line RedLine.

Руководствуясь приведенным определением объека класса Line, программой будут отведена области памяти, по структуре и размеру соответствующая элементам данных класса Line.

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

RedLine.SetColor(0);

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

struct Line {public: void SetColor(int);};

Ключ доступа Смысл использования ключа
private Элементы данных могут использоваться только функциями-членами класса, к которому принадлежат эти элементы данных
public Элементы данных могут употребляться любыми функциями программы, имеющими ту же область действия
protected Элементы данных доступны функциям-членам того же класса, а также функциям-членам производных классов

44. C++. Методы.

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

Любая используемая в модуле компиляции функция должна иметь прототип, включающий в себя тип функции, имя функции и список параметров с их типами. Прототип - это некоторое предварительное описание функции, заканчивающееся символом;.

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

Метод - член класса может иметь следующие модификаторы доступа:

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

Прототип метода может иметь следующее формальное описание:

модификатор_доступа тип_метода имя_метода (список_параметров);

Объявление метода может иметь следующее формальное описание:

модификатор_доступа тип_метода имя_метода (список_параметров) { тело_метода }

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

Указатели типа void могут использоваться для объявления параметров метода в том случае, если тип этих параметров на момент компиляции неизвестен.

тип *имя_метода(список_параметров).

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

Язык C++ допускает передачу параметров по значению и по ссылке или указателю. Изменение значений самих параметров происходит только для параметров, переданных по ссылке или указателю. При передаче параметра по значению метод изменяет не сам параметр, а его копию.

Язык C++ разрешает рекурсивный вызов методов.

В методах класса можно использовать ключевое слово this, являющееся указателем на объект данного класса. Это ключевое слово нельзя использовать вне метода члена класса.
45. C++. Инкапсуляция

Свойство языка программирования, позволяющее объединить и защитить данные и код в объект и скрыть реализацию объекта от пользователя (прикладного программиста). При этом пользователю предоставляется только спецификация (интерфейс) объекта.

• Пользователь может взаимодействовать с объектом только через этот интерфейс. Реализуется с помощью ключевого слова: public.

• Пользователь не может использовать закрытые данные и методы. Реализуется с помощью ключевых слов: private, protected, internal.

Инкапсуляция — один из четырёх важнейших механизмов объектно-ориентированного программирования (наряду с абстракцией, полиморфизмом и наследованием). Предостережение: Одна из наиболее распространенных ошибок — делать сокрытие реализации только ради сокрытия. Целями, достойными усилий, являются:

• предельная локализация изменений при необходимости таких изменений,

• прогнозируемость изменений (какие изменения в коде надо сделать для заданного изменения функциональности) и прогнозируемость последствий изменений.

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

Часто инкапсуляция может быть достигнута простейшими организационными мерами: знание того, что «вот так-то делать нельзя» иногда является самым эффективным средством инкапсуляции!

class A {

public:

int a, b; //данные открытого интерфейса

int ReturnSomething(); //метод открытого интерфейса

private:

int Aa = a, Ab = b; //скрытые данные и использование ими интерфейса

void DoSomething(); //скрытый метод

};

Ключ Смысл использования ключа
private Элементы данных могут использоваться только функциями-членами класса, к которому принадлежат эти элементы данных
public Элементы данных могут употребляться любыми функциями программы, имеющими ту же область действия
protected Элементы данных доступны функциям-членам того же класса, а также функциям-членам производных классов

46. C++. Полиморфизм. Перегрузка операция и методов.

Полиморфи́зм — взаимозаменяемость объектов с одинаковым интерфейсом.

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

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

Перегрузка операция и методов. Часто программы работают с объектами, которые являются конкретными представлениями абстрактных понятий. Например, тип данных int в C++ вместе с операциями +, -, *, / и т.д. предоставляет реализацию (ограниченную) математического понятия целых чисел. Такие понятия обычно включают в себя множество операций, которые кратко, удобно и привычно представляют основные действия над объектами. К сожалению, язык программирования может непосредственно поддерживать лишь очень малое число таких понятий. Например, такие понятия, как комплексная арифметика, матричная алгебра, логические сигналы и строки не получили прямой поддержки в C++. Классы дают средство спецификации в C++ представления неэлементарных объектов вместе с множеством действий, которые могут над этими объектами выполняться. Иногда определение того, как действуют операции на объекты классов, позволяет программисту обеспечить более общепринятую и удобную запись для манипуляции объектами классов, чем та, которую можно достичь используя лишь основную функциональную запись. Например:

class complex {

double re, im;

public:

complex(double r, double i) { re=r; im=i; }

friend complex operator+(complex, complex);

};

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

 


47. C++. Наследование. Ограничения при наследовании.

Наследование (inheritance) - это процесс, посредством которого один объект может приобретать свойства другого. Точнее, объект может наследовать основные свойства другого объекта и добавлять к ним черты, характерные только для него. Наследование является важным, поскольку оно позволяет поддерживать концепцию иерархии классов (hierarchical classification). Применение иерархии классов делает управляемыми большие потоки информации. Например, подумайте об описании жилого дома. Дом - это часть общего класса, называемого строением. С другой стороны, строение - это часть более общего класса - конструкции, который является частью ещё более общего класса объектов, который можно назвать созданием рук человека. В каждом случае порождённый класс наследует все, связанные с родителем, качества и добавляет к ним свои собственные определяющие характеристики. Без использования иерархии классов, для каждого объекта пришлось бы задать все характеристики, которые бы исчерпывающи его определяли. Однако при использовании наследования можно описать объект путём определения того общего класса (или классов), к которому он относится, с теми специальными чертами, которые делают объект уникальным. Наследование играет очень важную роль в OOP.

class A { public: int i; Func1();}

A:: Func1() { return this->i; }

// this - указатель класса A

Универсальность следует ограничивать. На типы универсального класса, являющиеся его параметрами, следует накладывать ограничения. Когда имеет место неограниченная универсальность, над объектами типов можно выполнять только те операции, которые допускают все типы. Неограниченная универсальность существенно ограничена. Ее ограничивает статический контроль типов. Бывают, разумеется, ситуации, когда необходимо на типы наложить ограничения, позволяющие ослабить границы статического контроля. На практике универсальность почти всегда ограничивается, что, повторяю, дает большую свободу программисту. В языке C# допускаются три вида ограничений, накладываемых на родовые параметры.: ограничение наследования, ограничение конструктора, ограничение value/reference.

public class Father<T1, T2>{ }

public class Base {public void M1() { }}

public class Child<T1,T2>:Father<T1,T2>

where T1:Base,IEnumerable<T1>, new()

where T2:struct,IComparable<T2> {}

 

48. Микропроцессорная система (МПС) представляет собой функционально законченное изделие, состоящее из одного или нескольких устройств, главным образом микропроцессорных. Микропроцессорная система может рассматриваться как частный случай электронной системы, предназначенной для обработки входных сигналов и выдачи выходных сигналов. В качестве входных и выходных сигналов при этом могут использоваться аналоговые сигналы, одиночные цифровые сигналы, цифровые коды, последовательности цифровых кодов. Внутри системы может производиться хранение, накопление сигналов (или информации), но суть от этого не меняется. Если система цифровая (а микропроцессорные системы относятся к разряду цифровых), то входные аналоговые сигналы преобразуются в последовательности кодов выборок с помощью АЦП, а выходные аналоговые сигналы формируются из последовательности кодов выборок с помощью ЦАП. Обработка и хранение информации производятся в цифровом виде. Характерная особенность традиционной цифровой системы состоит в том, что алгоритмы обработки и хранения информации в ней жестко связаны со схемотехникой системы. То есть изменение этих алгоритмов возможно только путем изменения структуры системы, замены электронных узлов, входящих в систему, и связей между ними. Естественно, это практически невозможно сделать в процессе эксплуатации, обязательно нужен новый производственный цикл проектирования, изготовления, отладки всей системы. Именно поэтому традиционная цифровая система часто называется системой на «жесткой логике». Системы на «жесткой логике» хороши там, где решаемая задача не меняется длительное время, где требуется самое высокое быстродействие, где алгоритмы обработки информации предельно просты. А универсальные, программируемые системы хороши там, где часто меняются решаемые задачи, где высокое быстродействие не слишком важно, где алгоритмы обработки информации сложные.

49. Микропроцессор - процессор, выполненный в виде одной либо нескольких взаимосвязанных интегральных схем. Микропроцессор состоит из цепей управления, регистров, сумматоров, счетчиков команд и очень быстрой памяти малого объема. Некоторые микропроцессоры дополняются сопроцессорами, расширяющими возможности микропроцессоров и набор выполняемых команд. Микропроцессор, как и любой другой процессор, является устройством, предназначенным для обработки или передачи данных. Он часто не имеет памяти, средств ввода-вывода данных. Эти задачи решаются внешними (по отношению к микропроцессору) интегральными схемами. Размеры слов, с которыми работают микропроцессоры, все время растут. Все больше используются 32- и 64-разрядные микропроцессоры. Последние позволяют резко увеличивать адресуемую память и размер файлов, с которыми работают. Это, в свою очередь, увеличивает быстродействие микропроцессоров. В тех случаях, когда память и средства ввода-вывода размещаются на той же подложке интегральной схемы, что и микропроцессор, последний превращается в микрокомпьютер. Микроконтроллер является специализированным микрокомпьютером, применяемым для управления различными устройствами. Например, принтерами, терминалами, аппаратами передачи данных. Микроконтроллеры нередко выпускаются сериями по несколько миллионов штук. Создание микропроцессоров позволяет уменьшить стоимость и размеры технических средств обработки информации, увеличить их быстродействие, снизить энергопотребление. Первый микропроцессор корпорации Intel 4004 на четырех кристаллах появился в 1971 г. Микропроцессор имел 4-битовую шину, адресуемую память 4,5 Кбит и выполнял 45 команд. Сейчас микропроцессоры выпускаются многими производителями. На их основе создается подавляющее число компьютеров. Некоторые микропроцессоры могут быть дополнены сопроцессорами, расширяющими возможности первых и набор выполняемых команд. Микропроцессор является основным компонентом микрокомпьютера. Простейшие микропроцессоры используются в компьютерных карточках (пластиковая карточка со встроенными в нее микропроцессором, программным обеспечением и энергонезависимым запоминающим устройством). Наряду с универсальными производятся специальные микропроцессоры, которые выполняют ограниченный набор функций, но они дешевле и потребляют меньше электроэнергии.

50. система команд. Все команды, выполняемые процессором, образуют систему команд процессора. Структура и объем системы команд процессора определяют его быстродействие, гибкость, удобство использования. Всего команд у процессора может быть от нескольких десятков до нескольких сотен. Система команд может быть рассчитана на узкий круг решаемых задач (у специализированных процессоров) или на максимально широкий круг задач (у универсальных процессоров). Коды команд могут иметь различное количество разрядов (занимать от одного до нескольких байт). Каждая команда имеет свое время выполнения, поэтому время выполнения всей программы зависит не только от количества команд в программе, но и от того, какие именно команды используются.Способы адресации: 1)Регистровая: Add R4,R3 - Требуемое значение в регистре 2)Непосредственная или литеральная: Add R4,#3 - Для задания констант 3)Базовая со смещением: Add R4,100(R1) - Для обращения к локальным переменным 4)Косвенная регистровая: Add R4,(R1) - Для обращения по указателю или вычисленному адресу 5)Индексная: Add R3,(R1+R2) - Иногда полезна при работе с массивами: R1 - база, R3 – индекс 6)Прямая или абсолютная: Add R1,(1000) - Иногда полезна для обращения к статическим данным 7)Косвенная: Add R1,@(R3) - Если R3-адрес указателя p, то выбирается значение по этому указателю 8)Автоинкрементная: Add R1,(R2)+ - Полезна для прохода в цикле по массиву с шагом: R2 - начало массива 9)Автодекрементная: Add R1,(R2)- - Аналогична предыдущей.Обе могут использоваться для реализации стека 10)Базовая индексная со смещением и масштабированием: Add R1,100(R2)[R3] - Для индексации массивов.

51. Структура процессора. Для выполнения команд в структуру процессора входят внутренние регистры, арифметико-логическое устройство (АЛУ, ALU — Arithmetic Logic Unit), мультиплексоры, буферы, регистры и другие узлы. Работа всех узлов синхронизируется общим внешним тактовым сигналом процессора. То есть процессор представляет собой довольно сложное цифровое устройство (рис. 1.4).


Рис. 1.4. Пример структуры простейшего процессора.

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

52. Программный обмен информацией является основным в любой микропроцессорной системе. Он предусмотрен всегда, без него невозможны другие режимы обмена. В этом режиме процессор является единоличным хозяином (или задатчиком, Master) системной магистрали. Все операции (циклы) обмена информацией в данном случае инициируются только процессором, все они выполняются строго в порядке, предписанном исполняемой программой. Процессор читает (выбирает) из памяти коды команд и исполняет их, читая данные из памяти или из устройства ввода/вывода, обрабатывая их, записывая данные в память или передавая их в устройство ввода/вывода. Путь процессора по программе может быть линейным, циклическим, может содержать переходы (прыжки), но он всегда непрерывен и полностью находится под контролем процессора. Ни на какие внешние события, не связанные с программой, процессор не реагирует. Все сигналы на магистрали в данном случае контролируются процессором.

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

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

 

55. Функции процессора, памяти, устройств ввода-вывода.

Функции процессора

Процессор представляет собой отдельную микросхему Микросхема процессора обязательно имеет выводы трех шин: шины адреса, шины данных и шины управления. Характеристики процессора — это количество разрядов его шины данных, шины адреса и количество управляющих сигналов в шине управления. Основные функции любого процессора:1)выборка (чтение) выполняемых команд; 2)ввод (чтение) данных из памяти или устройства ввода/вывода; 3)вывод (запись) данных в память или в устройства ввода/вывода; 4)обработка данных (операндов), в том числе арифметические операции над ними; 5)адресация памяти, то есть задание адреса памяти, с которым будет производиться обмен; 6)обработка прерываний и режима прямого доступа.

Функции памяти

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



Поделиться:


Последнее изменение этой страницы: 2016-04-26; просмотров: 504; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.149.243.32 (0.036 с.)