Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по С++.doc
Скачиваний:
27
Добавлен:
20.08.2019
Размер:
2.26 Mб
Скачать

Ссылочные переменные

Ссылка (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, компилятор знает, сколько байт следует извлечь и как их интерпретировать. Прототипы так же снижают вероятность ошибок в программе. Они обеспечивают следующее:

  • компилятор корректно обрабатывает возвращаемое значение:

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

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

Прототипирование происходит во время компиляции и называется статическим контролем типов.

Функции, по способу возврата результата, делятся на две группы:

  • возврат результата в точку вызова;

  • и по адресам формальных переменных.