- •1. Краткие теоретические сведения
- •1.1. Знакомство с функциями
- •1.2. Описание функции
- •1.3.1. Тело функции
- •1.3.2. Формальные параметры функции
- •1.3.3. Обращение к функции
- •1.3.4. Фактические параметры.
- •1.4. Формальные и фактические параметры функции
- •1.5. Описание и объявление функции. Прототип функции
- •1 Способ - Перед main().
- •2 Способ - После main ().
- •1.6. Передача параметров в функцию. Изменяемые значения параметров
- •1.6.1. Передача параметров
- •1.6.2. Передача параметров по значению
- •1.6.3. Передача параметров по ссылке
- •1.6.4. Передача параметров по указателю
- •1.7. Механизм обращения к функции и передача данных
- •1.8. Локальные и глобальные переменные. Время жизни и область действия (видимости) переменных
- •1.8.1. Представление об области видимости переменных
- •1.8.2. Объявление локальных переменных
- •1.8.3. О конфликте имен
- •1.8.4. Глобальные переменные
- •1.8.5. Если имена глобальных и локальных переменных конфликтуют
- •1.9. Принцип сокрытия данных внутри функции. Принцип локализации имен
- •1.10. Передача одномерных массивов как параметров функции
- •1.11. Передача многомерных массивов в функцию
- •1.12. Рекурсивные функции
- •1.13. Аргументы по умолчанию
- •1.14. Встраиваемые функции (inline)
- •1.15. Перегрузка функций
- •1.16. Указатель на функцию
- •1.17. Шаблоны функций
- •1.18. Использования библиотеки этапа выполнения
- •1.18.1. Использование функций библиотеки этапа выполнения
- •1.18.2. Изучение функций библиотеки этапа выполнения
- •1.18.3. Использование функций api
- •1.19. Изменение значений параметров функции
- •1.19.1. Почему функции обычно не могут изменить значения параметров
- •1.19.2. Изменение значения параметра
- •1.19.3. Использование ассемблерных листингов для лучшего понимания работы компилятора
- •1.20. Примеры решения задач с использованием механизма функций
- •2. Задание
- •2.4. Задания для выполнения на занятиях
- •2.4.1. Задание 1. Функции пользователя-использование формул
- •2.4.1.1. Условие задания
- •2.4.1.2. Пример для варианта 30
- •2.4.1.3. Программа
- •2.4.1.4. Тестирование
- •2.4.2. Задание 2. Функции пользователя при работе с массивами
- •2.4.2.1. Условие задания
- •2.4.2.2. Пример для варианта 30
- •2.4.2.3. Программа
- •2.4.2.4. Тестирование
- •2.4.3. Задание 3. Функции пользователя при работе с массивами
- •2.4.3.1. Условие задания
- •2.4.3.2. Пример для варианта 30
- •2.4.3.3. Программа
- •2.4.3.4. Тестирование
- •2.4.4. Задание 4. Вычисление выражений с использованием функций
- •2.4.4.1. Условие задания
- •2.4.4.2. Пример для варианта 30
- •2.4.4.3. Программа
- •2.4.4.4. Тестирование
- •2.4.5. Задание 5. Вычисление интеграла методом трапеций
- •2.4.5.1. Условие задания
- •2.4.5.2. Пример для варианта 30
- •2.4.5.3. Программа
- •2.4.5.4. Тестирование
- •2.4.5.5. Типичные ошибки при выполнении работы
- •Вопросы для самоконтроля
- •Литература
- •1. Краткие теоретические сведения 2
- •1.1. Знакомство с функциями 2
1.14. Встраиваемые функции (inline)
Для снижения накладных расходов на вызовы небольших функций в С++ предусмотрены встраиваемые (inline) функции. Спецификация inline перед указанием типа результата в объявлении функции советует компилятору сгенерировать копию кода функции в соответствующем месте, чтобы избежать вызова этой функции. В результате получается множество копий кода функции, вставленных в программу, вместо единственной копии, которой передается управление при каждом вызове функции.
Компилятор игнорирует спецификацию inline для всех функций, кроме самых малых.
Пример 13.28
Для расчета величины куба со стороной a использовать встроенную функцию.
#include <iostream.h>
inline float cube (const float a){return a*a*a;}
int main()
{ cout<<”enter a...”;
float side; cin>>side;
cout<<”side=”<<side<<” cube(side)=”<<cube(side)<<endl;
return 0;
}
1.15. Перегрузка функций
В С++ допустимо использование нескольких функций с одинаковым именем, но различным числом или типами параметров. Такое свойство называется перегрузкой функций. Перегруженные функции различаются компилятором по типам и числу параметров.
С++ позволяет определять несколько функций с одним и тем же именем, если они имеют разные наборы параметров (по меньшей мере разные типы параметров) – перегрузку функций. При вызове перегруженной функции компилятор определяет соответствующую функцию путем анализа количества, типов и порядка следования аргументов в вызове.
Пример 13.29
Использование перегруженной функции square для расчета квадрата переменной типа int и переменной типа double.
#include <iostream>
using namespace std;
int square (int x);
double square (double x);
int main()
{
cout<<”sqr (int x = 8)= ”
<< square (8)<<endl;
cout<<” sqr (double x = 1.1)= ”
<< square(1.1)<<endl;
system("pause");
return 0;
}
int square (int x) { return x*x; }
double square (double x) { return x*x; }
Пример 13.30
Написать функцию, которая суммирует два, или три целых числа, или все элементы целочисленного массива.
#include <iostream.h>
#include <conio.h>
// Прототипы функций
int Sum(int, int);
int Sum(int, int, int);
int Sum(int[], int);
int main()
{
int mas[] = {3,2,4,9,5,8}; // Инициализация массива mas
cout << Sum(5, 3) << endl;
cout << Sum(5, 3, 11) << endl;
cout << Sum(mas, 6) << endl;
return 0;
}
int Sum(int a, int b) // Функция суммирования двух чисел
{
return a+b;
}
int Sum(int a, int b, int c) // Функция суммирования трех чисел
{
return a+b+c;
}
int Sum(int a[], int n) // Функция суммирования элементов массива
{
int s = 0;
for (int i=0; i<n; i++)
s+= a[i];
return s;
}
1.16. Указатель на функцию
Так как имя функции является указателем на начало функции в оперативной памяти, то можно объявлять указатели на функции для последующего их использования в программе.
При объявлении указатель должен возвращать тот же тип и иметь такие же аргументы, как и функция, на которую он будет указывать.
Например, имеется функция:
double y (double x, int n)
Объявляем указатель на функцию:
double (*fun) (double, int);
Присвоим указателю fun адрес функции y:
fun = y;
Функцию через указатель можно вызывать
x = fun (t, m);
или
x = (*fun) (t, m);