Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Програм. и основы алгорит.з.о..doc
Скачиваний:
5
Добавлен:
17.11.2019
Размер:
293.89 Кб
Скачать

2.4.4 Объединение (смесь)

Объединение (смесь) представляет собой частный случай структуры, все поля которой располагаются по одному и тому же адресу. Формат описания такой же, как и у структуры, только вместо ключевого слова struct используется слово union. Длина объединения равна наибольшей из длин его полей. В каждый момент времени в переменной типа объединение хранится только одно значение, и ответственность за правильное его использование лежит на программисте.

union ind_un {

int i; // требуется 2 байта

double j; // требуется 8 байт

char k; // требуется 1 байт

} m, *mptr=&m;

// Для хранения переменной m типа union ind_un будет выделено // 8-байт (значения double)

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

#include <iostream.h>

int main(){

enum paytype {CARD, CHECK};

paytype ptype;

union payment {

char card[25];

long check;} info;

/* присваивание значений info и ptype */

switch (ptype){

case CARD: cout << “Оплата по карте”<<info.card; break;

case CHECK: cout<< “Оплата чеком”<<info.check; break;

}

return 0;

}

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

По сравнению со структурами на объединения налагаются некоторые ограничения:

  • объединение может инициализироваться только значением его первого элемента;

  • объединение не может содержать битовые поля;

  • объединение не может содержать виртуальные методы, конструкторы, деструкторы и операцию присваивания;

  • объединение не может входить в иерархию классов.

Контрольные вопросы

1. Назовите основные отличительные характеристики типа данных «структура».

2. Какие типы полей может содержать структура?

3. Назовите способы обращения к элементам структуры.

4. Назовите способы описания переменных структурного типа.

5. Можно ли присваивать переменной структурного типа структуру?

6. Каковы отличия структуры от перечисления?

7. Каковы отличия структуры от смеси (объединения)?

8. Каковы отличия структуры от массива?

9. Чем отличаются указатели на массив и на структуру?

2.5 Функции

2.5.1 Общие сведения о функциях

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

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

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

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

Все, что передается в функцию и обратно, должно отражаться в заголовке (объявлении, прототипе). Это не требование синтаксиса, а хорошего стиля.

Формат простейшего заголовка функции:

тип имя ( [ список_параметров ] );

где спецификация тип - задаёт тип возвращаемого функцией значения. Если указание типа отсутствует, то считается, что функция возвращает значение int. Если вместо типа стоит клю­чевое слово void, то считается, что функция не возвращает в вызывающую программу никакого значения. Особый случай, когда используется тип void* - родовой указатель. В этом случае результат работы функции есть указатель.

Имя - идентификатор произвольного вида, являющийся указателем на функцию, значение которого равно адресу точки входа в функцию.

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

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

Определение функции, кроме заголовка, включает ее тело, т.е. те операторы, которые выполняются при вызове функции.

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

Оператор return - необязательный оператор, обеспечивающий выход из функции. Если оператор return используется совместно с выражением, то выход из функции сопрово­ждается передачей вычисленного значения в точку вызова. Тип результата должен совпа­дать или быть совместимым с типом функции. При отсутствии оператора return выход из функции происходит после выполнения послед­него оператора в теле функции.

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

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