Функции. Основные принципы структурной методологии. Принцип формальности. Принцип иерархического упорядочивания, страница 8

В С++ есть функции стандартной библиотеки, предназначенные для работы с символами (заголовочные файлы <ctype.h> или <cctype>), а также две возможности работы со строками: функции, унаследованные из библиотеки С (заголовочные файлы <string.h> или  <cstring>, <stdlib.h> или <cstdlib>),  и библиотечный класс string.

Механизм вызова функций и передачи параметров

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

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

•  вычисление и запоминание в локальной памяти точки возврата в вызывающую функцию;

•  вычисление значений аргументов, соответствующих параметрам-значениям и ссылка на память аргументов, соответствующих параметрам-переменным;

•  подстановка аргументов (в стеке выделяется память под формальные параметры функции в соответствии с их типом, и каждому из них присваивается значение соответствующего аргумента); при этом проверяется соответствие типов и при необходимости выполняются их преобразования; при несоответствии типов выдается диагностическое сообщение.

•  выполнение операторов тела функции и запоминание в локальной памяти значения, возвращаемого из вызова функции;

•  копирование из локальной памяти в память вызывающей функции (в переменную, отведенную для этих целей) значения, возвращаемого из вызова функции;локальная память функции делается недоступной, освобождается для выполнения следующих вызовов;

•  продолжение выполнения вызывающей функции с точки возврата.

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

При передаче по значению в стек заносятся копии значений аргументов, и операторы функции работают с этими копиями. Формальный параметр-значение равносилен локальной переменной этой функции – ему отводится место в той же памяти, а изменение его значения в теле функции никак не влияет на значения фактического параметра (аргумента). При вызове функции фактический параметр (аргумент) может задаваться константой, переменной или даже выражением. Значение аргумента присваивается соответствующему формальному параметру. Аргумент должен иметь тип, совместимый по присваиванию с типом формального параметра. Для таких параметров запрещен файловый тип. Доступа к исходным значениям параметров у функции нет, а, следовательно, нет и возможности их изменить.

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

void f (int i, int* j, int& k)

{ i++;

(*j)++;

k++};

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

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