Подпрограммы. Понятие подпрограммы. Критерии создания подпрограмм. Основные виды подпрограмм: процедуры и функции. Возвращаемое значение. 


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



ЗНАЕТЕ ЛИ ВЫ?

Подпрограммы. Понятие подпрограммы. Критерии создания подпрограмм. Основные виды подпрограмм: процедуры и функции. Возвращаемое значение.



 

С увеличением объема программы становится невозможным удерживать в памяти

все детали. Естественным способом борьбы со сложностью любой задачи

является ее разбиение на части. В C++ задача может быть разделена на более

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

в более укрупненном виде — на уровне взаимодействия функций. Это

важно, поскольку человек способен помнить ограниченное количество фактов.

Использование функций является первым шагом к повышению степени абстракции

программы и ведет к упрощению ее структуры.

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

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

многократно из разных точек программы. Процесс отладки программы, содержащей

функции, можно лучше структурировать. Часто используемые функции

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

и сопровождении программы.

Следующим шагом в повышении уровня абстракции программы является группировка

функций и связанных с ними данных в отдельные файлы (модули), компилируемые

раздельно. Получившиеся в результате компиляции объектные

модули объединяются в исполняемую программу с помощью компоновщика.

Разбиение на модули уменьшает время перекомпиляции и облегчает процесс отладки,

скрывая несущественные детали за интерфейсом модуля и позволяя отлаживать

программу по частям (или разными программистами).

Модуль содержит данные и функции их обработки. Другим модулям нежелательно

иметь собственные средства обработки этих данных, они должны пользоваться

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

нужно знать только его интерфейс, а не все детали его реализации. Чем

более независимы модули, тем легче отлаживать программу. Это уменьшает общий

объем информации, которую необходимо одновременно помнить при отладке.

Разделение программы на максимально обособленные части является сложной

задачей, которая должна решаться на этапе проектирования программы.

Скрытие деталей реализации называется инкапсуляцией. Инкапсуляция яв'ляет-

ся ключевой идеей как структурного, так и объектно-ориентированного программирования.

Пример инкапсуляции — помещение фрагмента кода в функцию и

передача всех необходимых ей данных в качестве параметров. Чтобы использовать

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

(имя, тип возвращаемого значения и типы параметров). Интерфейсом

модуля являются заголовки всех функций и описания доступных извне типов,

переменных и констант. Описания глобальных программных объектов во всех

модулях программы должны быть согласованы.

Модульность в языке C++ поддерживается с помощью директив препроцессора,

пространств имен, классов памяти, исключений и раздельной компиляции (строго

говоря, раздельная компиляция не является элементом языка, а относится

к его реализации).

 

 

Возвращаемое значение

Механизм возврата из функции в вызвавшую ее функцию реализуется оператором

r e t u r n [ выражение ];

Функция может содержать несколько операторов return (это определяется потребностями

алгоритма). Если функция описана как void, выражение не указывается.

Оператор return можно опускать для функции типа void, если возврат из

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

В этой книге для экономии места оператор return в функции main не указан, поэтому

при компиляции примеров выдается предупреждение. Выражение, указанное

после return, неявно преобразуется к типу возвращаемого функцией значения

и передается в точку вызова функции.

Параметры функций. Вызов функций. Определение функций на языке С++.

 

Параметры функции

Механизм параметров является основным способом обмена информацией между

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

описания функции, называются формальными параметрами, или просто параметрами,

а записанные в операторе вызова функции — фактическими параметрами,

или аргументами.

При вызове функции в первую очередь вычисляются выражения, стоящие на

месте аргументов; затем в стеке выделяется память под формальные параметры

функции в соответствии с их типом, и каждому из них присваивается значение

соответствующего аргумента. При этом проверяется соответствие типов и при

необходимости выполняются их преобразования. При несоответствии типов выдается

диагностическое сообщение.

Существует два способа передачи параметров в функцию: по значению и по адресу.

При передаче по значению в стек заносятся копии значений аргументов, и операторы

функции работают с этими копиями. Доступа к исходным значениям параметров

у функции нет, а, следовательно, нет и возможности их изменить.

При передаче по адресу в стек заносятся копии адресов аргументов, а функция

осуществляет доступ к ячейкам памяти по этим адресам и может изменить исходные

значения аргументов:

Первый параметр (1) передается по значению. Его изменение в функции не

влияет на исходное значение. Второй параметр (j) передается по адресу с помощью

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

используется операция взятия адреса, а для получения его значения в

функции требуется операция разыменования. Третий параметр (к) передается по

адресу с помощью ссылки.

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

а внутри функции все обращения к параметру неявно разыменовываются.

Поэтому использование ссылок вместо указателей улучшает читаемость программы,

избавляя от необходимости применять операции получения адреса и

разыменования. Использование ссылок вместо передачи по значению более эффективно,

поскольку не требует копирования параметров, что имеет значение

при передаче структур данных большого объема.

Если требуется запретить изменение параметра внутри функции, используется

модификатор const:

1nt f(const char*);

char* t(char* a. const int* b);

 

 



Поделиться:


Последнее изменение этой страницы: 2017-02-07; просмотров: 177; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

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