Ссылка (reference) представляет собой видоизмененную форму указателей, которая используется в качестве псевдонима другой переменной. Для ссылок не требуется дополнительно памяти.
Пример объявления ссылочной переменной:
#include <iostream>
using namespace std ;
void main ()
{
int t = 13, //инициализация t
&r = t; //r синоним имени t
cout<<”Начальное значение t = ”<<t; //выводит 13
r +=10;
cout<<”Конечное значение t = ”<<t; //выводит 23
}
На переменные ссылочного типа накладываются ограничения:
· нельзя взять адрес переменной ссылочного типа;
· запрещается использовать массивы ссылок;
· не допускается использовать ссылки на битовые поля;
· нельзя создать указатель на ссылку.
Основное назначение ссылок:
· их используют в качестве формальных параметров функции;
· представляют собой удобную альтернативу указателям при обработке крупных структур посредством функций;
· они играют важную роль при создании классов.
Функция (function) представляет собой именованный законченный алгоритм, который может неоднократно выполняться в различных местах программы с разными исходными данными, возвращая различные результаты своей работы. Тело функции может сохраняться как в теле основной программы, так и в отдельном файле. Файл может представлять собой библиотеку программиста или пользователя.
Библиотеки функций позволяют:
· использовать одни и те же функции разными программистами;
· повысить структурированность и наглядность программы;
· облегчить написание и отладку программы.
Любая программа на языке С++ содержит одну главную функцию “main” и любое количество других авторских или служебных функций. Действие программы имеющей подпрограммы, начинаются с главной функции “main”. Подпрограмма выполняется только после вызова. Для того чтобы в точке вызова функции была видна функция, ее описание должно находиться выше блока вызываемой функции. При создании функций надо определить:
· класс памяти и видимость переменных функций;
· определение функций (тексты функций);
· объявление функции;
· вызов функции;
· способы обмена данными различных типов между функциями.
Определение функции – это текст, который содержит заголовок и тело функции. Тело функции – это блок, в котором определяется тип внутренних переменных и операторы тела функции. Структура функции идентична главной функции “main”.
Структура заголовка функции:
[спецификатор класса памяти] [тип возвращаемого параметра] имя_функции ([список формальных параметров])
· спецификатор класса памяти – спецификатор, который определяет класс памяти функции;
· тип возвращаемого параметра – определяет тип результата, возвращаемого функцией в точку вызова с помощью оператора return. Тип результата, может быть, простой или указатель на любой структурированный тип;
· имя_функции – уникальный идентификатор, с помощью которого функция вызывается для выполнения;
· список формальных параметров – определяется тип и имена формальных параметров-переменных функции, с помощью которых производится обмен данными между вызываемой и вызывающей функциями в процессе выполнения программы.
Элементы заголовка функции в квадратных скобках необязательны.
Область видимости функции является файл, где находится её определение. Код функции закрыт и недоступен для других функций. Данные, определенные внутри какой-либо функции, никак не взаимодействуют с данными из другой функции, поскольку область видимости каждой функции индивидуальна. Переменные, которые определены в теле функции, называются локальными. Они автоматически создаются при входе в функцию и автоматически уничтожаются при выходе из нее. Такая организация переменных называется автоматической. Локальные переменные не сохраняют свои значения между вызовами функции. Если функция находится в одном файле с главной функцией, то тело функции или её прототип должны находиться выше вызываемой функции.
Структура прототипа функции:
[спецификатор класса памяти] [тип возвращаемого параметра] имя_функции ([список формальных параметров]);
Прототип функции – это оператор, поэтому он должен завершаться точкой с запятой. Простейший способ получить прототип – скопировать заголовок функции из её определения и добавить точку с запятой. Однако прототип функции не требует предоставления имен формальных параметров, достаточно списка типов. Имена переменных в прототипе служат указанием места аргумента, поэтому если они заданы, то не обязательно должны совпадать с именами в определении функции. Прототип описываются выше вызывающе функции , а его блок описываются ниже. Прототипы функций должны находиться в той же последовательности, что и тела функций.
Пример функции, возвращающей значение в точку вызова
#include <iostream>
#include <cmath>
using namespace std ;
// прототипы функций
long double fact ( const int ) ;
double cube(double x);
// главная функция
void main ( )
{
int x = 8 ;
cout << fact ( x ) << endl ;
x = fact ( x ) ; cout << x << endl ;
long double y ;
y = fact ( 150 ) ; cout << y << endl ;
cout<<”Введите целее число до 10”;
cin>> x;
cout<<”Куб числа ”<< x<<” = ”<<cube(x);
cout<<”Куб числа ”<< 1.2<<” = ”<<cube(1.2);
}
// определение вычисления
long double fact ( const int n)
{
int I (n);//переменная I инициализируется значением //переменной n
long double res = 1 ;
while ( i > 1 ) res *= i-- ;
return res ;//тип переменной res совпадает с типом //возвращаемого параметра
}
double cube(double x)
{
return pow(x,3); //в операторе return присутствует //выражение типа double
}
Прототип функции описывает интерфейс функции для компилятора, он сообщает компилятору, коков тип возвращаемого значения, а также количество и типы формальных параметров. Когда функция cube(x) завершает вычисление, она помещает возвращаемое значение в некоторое определенное место (либо в регистр ЦП, а возможно в ОП), затем вызывающая функция (void main ( )) извлекает значение из этого места. Т.К. прототип устанавливает, что cube() возвращает тип double, компилятор знает, сколько байт следует извлечь и как их интерпретировать. Прототипы так же снижают вероятность ошибок в программе. Они обеспечивают следующее: