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

Параметры-ссылки

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

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

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

Подобно указателю на функцию определяется и ссылка на функцию:

тип_функции (&имя_ссылки) (спецификация_параметров) инициализирующее_выражение;

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

int infunc(float,int); // Прототип функции

int (& iref) (float, int) = infunc; // Определение ссылки

iref - ссылка на функцию, возвращающую значение типа int и имеющую два параметра с типами float и int. Напомним, что использование имени функции без скобок (и без параметров) воспринимается как адрес функции.

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

Объявления переменных

Переменные (объекты) следует определять по месту их использования. Например:

for(int i=0; i<10; ++i){/*...*/}

Встраиваемые функции

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

  • команды переходов;

  • команды, сохраняющие значения регистров процессора;

  • команды, помещающие и извлекающие из стека аргументы;

  • команды, восстанавливающие значения регистров после выполнения;

  • команды перехода из функции обратно в программу.

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

inline тип имя_функции(список_параметров);

Однако, если в функции требуется вызов деструктора, подстановки не происходит.