Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Сходства и различия классов, структур и объединений.




Совместимость Си и C++

Отличия структур и объединений от классов

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

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

Структуры (struct) и объединения (union) представляют собой частные случаи классов. Структуры отличаются от классов тем, что доступ к элементам, а также базовый класс при наследовании по умолчанию считаются public. Структуры предпочтительнее использовать для объектов, все элементы которых доступны.

Доступ в объединениях также устанавливается public, кроме того, в них вообще нельзя использовать спецификаторы доступа. Объединение не может участвовать в иерархии классов. Элементами объединения не могут быть объекты, содержащие конструкторы и деструкторы. Объединение может иметь конструктор и другие методы, только не статические. В анонимном объединении методы описывать нельзя.

В отличие от структур С++, объединения С++ не могут использовать спецификаторы класса доступа:public, private и protected. Все поля объединения имеют доступ private.

При создании Си++ стремились сохранить совместимость с языком Си. Большинство программ на Си будут исправно работать и с компилятором Си++. Си++ имеет синтаксис, основанный на синтаксисе Си.

Нововведениями Си++ в сравнении с Си являются:

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

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

 

Классы и объекты. Определение класса и области видимости. Опережающее объявление класса

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

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

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

Две роли классов

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

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

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

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

синтаксис описания класса:

[атрибуты][модификаторы]class имя_класса[:список_родителей]{тело_класса}

 

Возможными модификаторами в объявлении класса могут быть модификаторы abstract, sealed, и четыре модификатора доступа, два из которых - private и protected - могут быть заданы только для вложенных классов. По умолчанию класс имеет атрибут доступа internal.Чтобы сделать класс доступным не только классам одного проекта, его явно нужно объявить с атрибутом public. Так что в простых случаях объявление класса может выглядеть так:

public class Rational {тело_класса}

В теле класса могут быть объявлены:

  • константы;
  • поля;
  • конструкторы и деструкторы;
  • методы;
  • события;
  • классы (структуры, делегаты, интерфейсы, перечисления).

Из синтаксиса следует, что классы могут быть вложенными. Такая ситуация довольно редкая. Ее стоит использовать, когда некоторый класс носит вспомогательный характер, разрабатывается в интересах другого класса, и есть полная уверенность, что внутренний класс никому не понадобится, кроме класса, в который он вложен и, возможно, его потомков. Внутренние классы обычно имеют модификатор доступа private или protected. Классы как типы данных

Поля класса

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

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

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

Функция: Метки можно использовать повсюду в функции, в которой они описаны. Только метки имеют область видимости, совпадающую с функцией.

Файл: Имя, описанное вне всех блоков и классов, имеет область видимости файл и может быть использовано в единице трансляции, в которой оно появляется после момента описания. Имена, описанные с файловой областью видимости, называются глобальными.

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

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

В дополнение к этому, имя класса может быть скрыто именем объекта, функции или элемента перечисления, имеющего ту же область видимости. Если класс и объект, или функция, или элемент перечисления описаны (в любом порядке) с одинаковым именем в одной области видимости, то имя класса становится скрытым. Имя класса, скрытое в локальной области видимости или в области видимости класса именем объекта, функции или элемента перечисления, все-таки можно использовать, если предварить его подходящей спецификацией class, struct или union. Аналогично, скрытое имя элемента перечисления можно использовать, если предварить его спецификацией типа enum.

Моментом описания имени считается момент завершения описателя имени, предшествующей части инициализации (если она есть). Например:

int x = 12;

{

int x = x;

}

Здесь второе x инициализируется своим собственным (неопределенным) значением.

Моментом описания элемента перечисления считается момент сразу после появления его идентификатора, например:

enum { x = x };

Здесь элемент перечисления x опять инициализируется своим собственным (неопределенным) значением.

Опережающее объявление

class Point2D;

// Это имя будет определено в программе далее

Опережающее объявление классов. Оно позволяет всем классам в модуле быть перечисленными в начале секции объявления типов. Это очень удобно.

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

 

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...