ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 19.04.2024
Просмотров: 186
Скачиваний: 0
СОДЕРЖАНИЕ
1 Основные принципы перегрузки операций
Запреты на перегрузку операций
Динамическое распределение памяти
4. Классы программных продуктов
1) Составление технического задания на программирование
2) Составление технического проекта
3) Создание рабочей документации (рабочего проекта)
2) Графический интерфейс пользователя
9. Сети эвм и протоколы передачи информации:
Защищенные элементы.
Все функции программы имеют доступ к открытым элементам базового класса. Доступ к закрытым элементам базового класса имеют только элементы-функции самого класса и его «друзья».
Защищенный доступ представляет собой промежуточный уровень защиты между закрытым и открытым доступом. Защищенные элементы базового класса могут быть доступны только для элементов и друзей самого класса и для элементов и друзей производных классов.
Элементы производного класса могут вызывать открытые и защищенные элементы базового класса просто по имени элемента. При этом не обязательно использовать операцию разрешения области действия - по умолчанию имеется в виду текущий объект.
Сложное наследование.
До сих пор мы обсуждали механизм простого наследования, в котором каждый класс выводится только из одного базового класса. Однако класс может быть получен из нескольких базовых классов; такой механизм образования класса называется сложным наследованием. Сложное наследование означает, что производный класс наследует элементы нескольких базовых классов. Этот мощный механизм дает интересные формы повторного использования программного обеспечения, но вместе с тем может порождать ряд проблем, связанных с неоднозначностью.
Абстрактные базовые классы и конкретные классы
Когда мы говорим о классе как о типе, мы подразумеваем, что будут создаваться объекты этого типа. Однако во многих случаях бывает полезно определять классы, объекты которых не будут создаваться. Такие классы называются абстрактными классами. Поскольку они используются в наследовании в качестве базовых классов, мы будем называть их абстрактными базовыми классами. Объекты абстрактного базового класса создавать нельзя.
Единственная цель определения абстрактного класса состоит в том, чтобы предусмотреть обобщенныйбазовый класс, на основе которого строится иерархия наследования. Классы, для которых могут создаваться объекты, называются конкретными классами.Например, мы могли бы определить абстрактный базовый класс TwoDimensionalObject и произвести от него классы типа Square, Circle, Triangle
3 Структуры
Описание структур
Структуры — это наборы (иногда их называют агрегатами) логически связанных переменных, объединенных под одним именем Структуры часто используются, чтобы определить записи, которые должны сохраняться в файлах. Указатели и структуры могут служить базой для создания более сложных структур данных, таких как связанные списки, очереди, стеки и деревья.
Структуры — это производные типы данных, они создаются из объектов других типов. Рассмотрим следующее описание структуры;
struct card
{
char *face;
char *suit;
};
Ключевое слово struct определяет структуру. Идентификатор card является именем-этикеткой структуры. Имя-этикетка именует структуру, и используется совместно с ключевым словом struct для объявления переменных типа структуры. В данном примере тип структуры - struct card. Переменные, объявленные внутри скобок структуры, являются элементами структуры Определение struct card содержит два элемента типа char * - face и suit.
Объявление
struct card a, deck[52], *cPtr;
объявляет а - переменную типа struct card, deck - массив из 52 элементов типа struct card и cPtr - указатель на struct card. Можно объявить переменные данной структуры и по-другому, разместив разделенный запятыми список переменных между закрывающей скобкой определения структуры и точкой с запятой, завершающей ее определение. Например, указанное выше объявление, объединенное с определением структуры, будет выглядеть следующим образом:
struct card
{
char *face;
char *suit;
} a, deck[52], *cPtr;
Имя-этикетка не является для структуры обязательным. Если определение структуры не содержит имя-этикетку, переменные для этой структуры могут быть объявлены только в определении структуры, но не отдельным объявлением.
Инициализация структур
Структуры можно инициализировать, как и массивы, используя список инициализации. Чтобы инициализировать структуру, после имени переменной в объявлении структуры ставится знак равенства, за которым следует помещенный в фигурные скобки, разделенный запятыми список инициализаторов. Например, объявление
struct card a = {"Three", "Hearts"};
создает переменную а типа struct card (структура определена выше) и присваивает элементу face значение "Three", а элементу suit значение "Hearts", Если инициализаторов в списке меньше, чем элементов в структуре, остальным элементам автоматически присваивается значение 0 (или NULL, если элемент — указатель). Переменным-структурам, объявленным вне определения любой функции (т.е. глобально) присваиваются 0 или NULL, если они явно не инициализированы во внешнем объявлении. Структуры можно инициализировать и с помощью оператора присваивания. При этом можно либо присвоить переменной-структуре переменную того же типа, либо присвоить значения отдельным элементам структуры,
Доступ к элементам структур
Для обращения к элементам структур используются две операции: операция элемента структуры (.), также называемая операцией-точкой, и операция указателя структуры (->), также называемая операцией-стрелкой. Операция элемента структуры обращается к элементу через имя переменной структуры. Например, для того чтобы напечатать элемент suit структуры а из предыдущего объявления, можно написать оператор
printf("%s", a.suit);
Операция указателя структуры, состоящая из знака минус (-) и знака больше (>) без пробела между ними, обращается к элементу через указатель структуры. Предположим, что переменная aPtr была объявлена как указатель на struct card и ей был присвоен адрес структуры а. Чтобы напечатать элемент suit структуры а при помощи указателя aPtr, напишите оператор
printf ("%s", aPtr->suit);
Typedef
Ключевое слово typedef предоставляет программисту механизм для создания синонимов (или псевдонимов) для ранее определенных типов данных. Часто используют typedef для того, чтобы дать укороченное имя структурному типу. Например, оператор
typedef struct card Card;
определяет новый тип с именем Card, как синоним типа struct card. Пишущие на С часто используют typedef, чтобы определить тип структуры, при этом отпадает необходимость в имени-этикетке, Например, следующее определение
typedef struct
{
char *fасе;
char *suit;
} Card;
создает тип Card без использования отдельного оператора typedef.
Теперь Card можно использовать для объявления переменных типа struct card. Объявление
Card deck [52];
описывает массив, состоящий из 52 структур Card (т.е. переменных типа struct card).
Объединения
Объединение - производный тип данных, подобный структуре, элементы которого разделяют одну и ту же область памяти. На различных этапах выполнения программы одни переменные могут оказаться невостребованными, в то время как другие, наоборот, используются только в этой части программы, поэтому объединения экономят пространство вместо того, чтобы впустую тратить память на не использующиеся в данный момент переменные. Элементы объединения могут принадлежать к любому типу. Число байтов, используемое для хранения объединения, должно быть, по крайней мере, достаточным для хранения наибольшего из элементов. В большинстве случаев объединения содержат два или более типа данных. Ссылаться в данный момент времени можно только на один элемент и, соответственно, только один тип данных. Задача программиста - обеспечить, чтобы на данные, хранящиеся в объединении, ссылались как на данные соответствующего типа.
Объединение объявляется с помощью ключевого слова union. Формат объявления тот же, что и в случае структуры. Объявление union
union number
{
int x;
float y;
};
означает, что number является типом union с элементами int x и float у..
При объявлении объединение можно инициализировать только значениями того же самого типа, что и его первый элемент. Например, в представленном выше объединении объявление
union number value = {10};
однако объявление следующего вида будет ошибочным:
union number value = {1.43};
Структуры, ссылающиеся на себя
Мы уже изучали ранее структуры данных фиксированного размера, такие, как одномерные массивы, двумерные массивы и структуры. В этой главе будут рассмотрены динамические структуры данных, размер которых, может увеличиваться или уменьшаться при исполнении программы
Структуры, ссылающиеся на себя, содержат в качестве элемента указатель, который ссылается на структуру того же типа. Например, определение
struct node
{
int data;
struct node *nextPtr;
};
описывает тип struct node. Структура типа struct node состоит из двух элементов - целого data и указателя nextPtr. Элемент nextPtr указывает на структуру типа struct node - структуру того же самого типа, что и только что объявленная нами, отсюда и термин «структура, ссылающаяся на себя». Элемент nextPtr иногда называют связкой, т.е. nextPtr можно использовать для того, чтобы связать структуру типа struct node с другой структурой того же типа Рис. 4 иллюстрирует две структуры, ссылающиеся на себя, связанные друг с другом и образующие список. Заметьте, что в связывающем элементе второй структуры нарисована представляющая указатель NULL косая черта, чтобы показать, что этот элемент не указывает на другую структуру. Указатель NULL обычно обозначает конец структуры данных, так же как символ NULL обозначает конец строки.
Рис. 4 Две ссылающиеся на себя структуры, связанные друг с другом