- •2. Структура и основные элементы программы
- •3.Общее понятие типов данных
- •4. Переменные и константы
- •5.Основные типы данных
- •6. Спецификаторы типов данных
- •7. Определение переменных и констант в программе
- •8. Инициализация переменных различных типов
- •9.Целочисленные типы данных
- •10. Вещественные типы данных
- •11. Особенности представления вещественных типов данных
- •12.Логический тип данных
- •13. Символьный тип данных
- •14. Управляющие последовательности
- •15. Операции и выражения
- •16. Операция присваивания, составные операции присваивания
- •17. Понятие l-значения
- •18. Преобразование типов данных
- •19. Арифметические операции
- •20. Операции инкремента и декремента, их разновидности
- •21. Операции отношения
- •22. Логические операции
- •23. Побитовые операции сдвига
- •24. Побитовые логические операции
- •25. Примеры применения побитовых операций
- •26. Условная операция и ее использование
- •27. Определение объема памяти, необходимого для размещения объектов
- •28. Понятие приоритета операций и его влияние на результаты вычислений
- •31.Флаги форматирования потоков ввода-вывода
- •32. Форматирование ввода-вывода с помощью манипуляторов
- •33.Форматирование ввода-вывода с помощью функций потоков ввода-вывода
- •34. Управление шириной поля вывода и выравниванием данных при выводе
- •35. Управление форматом вывода вещественных значений
- •36. Основные понятия структурного программирования
- •37. Базовый набор управляющих структур
- •39.Условная инструкция (if)
- •40. Инструкция множественного выбора (switch)
- •42. Цикл с постусловием (do while)
- •43. Итерационный цикл (for)
- •46. Инструкция перехода goto
- •47. Понятие рекуррентных вычислений, примеры
- •48. Понятие инварианта цикла
- •49. Понятие и определение массива
- •52. Ввод элементов массивов с клавиатуры
- •53. Декларативная и программная инициализация массивов
- •54. Копирование массивов
- •55. Нахождение минимальных и максимальных значений в массивах
- •56. Сдвиг элементов массивов
- •57. Перестановка элементов в массивах
- •58. Поиск данных в массивах
- •59. Сортировка данных в массивах
- •60. Вычисление сумм и произведений элементов массивов
- •61. Представление текстовых строк в виде массива символов
- •62. Ввод-вывод символьных строк
- •63. Определение фактической длины строки
- •64. Копирование символьных строк
- •65. Основные функции обработки строк библиотеки cstring
- •66. Массивы текстовых строк (двумерные массивы символов)
- •67. Указатели Понятие указателя
- •Работа с указателями
- •68. Арифметика указателей
- •69. Индексирование указателей
- •70. Ссылки
- •71. Определение функции
- •72. Инструкция return
- •73. Завершение работы функции
- •74. Механизмы передачи данных через параметры функций
- •75. Передача данных по значению
- •76. Передача данных через указатели
- •77. Передача данных по ссылке
- •78. Параметры по умолчанию
- •79. Функции с переменным числом параметров
- •80. Inline функции
- •81. Перегрузка функций
- •82. Рекурсия
- •83. Прототипы функций
80. Inline функции
Использование функций снижает быстродействие программы. Это объясняется затратами времени на вызов функций (работа со стеком программы). Если в программе используется большое количество вызовов небольших функций, то быстродействие программы может существенно снизиться.
Избежать этого можно применением, так называемых, встраиваемых функций. Встраиваемые функции задаются ключевым словом inline:
inline int ReadInt(char *S) // Ввод целых значений по текстовому запросу S
{
cout << S;
int I;
cin >> I;
return I;
}
{
……..
int Vozrast = ReadInt (“Сколько Вам лет? ”);
……..
int Kurs = ReadInt (“На каком курсе Вы учитесь? ”);
……..
int Ocenka = ReadInt (“Сколько у Вас отличных оценок в последней сессии? ”);
……..
}
При определении inline-функции компилятор заменяет (если это можно сделать) каждый вызов этой функции кодом функции. При такой подстановке код программы увеличивается, но зато экономится время на вызов встроенной функции.
Обычно в качестве встраиваемых функций используются часто вызываемые небольшие по объему функции. Использование больших по объему часто вызываемых встраиваемых функций может привести к чрезмерному росту объема программы, что тоже может быть нежелательно. Поэтому к использованию встраиваемых функций надо подходить разумно.
Некоторые компиляторы накладывают определенные ограничения на содержание встраиваемых функций. К таким ограничениям обычно относятся использование внутри встраиваемых функций:
• рекурсии;
• циклов, переключателей, инструкций goto;
• статических (static) переменных.
В любом случае компилятор сам определит можно ли встраивать функцию или необходимо вызвать ее обычным способом.
81. Перегрузка функций
Поскольку при вызове функций типы данных подставляемых аргументов и их количество должны соответствовать типам данных и количеству параметров функций, в языке C приходилось использовать множество функций с различными именами для выполнения одних и тех же действий над различными типами данных. Например, для вычисления абсолютного значения некоторого числа в библиотеках языка C имелось несколько различных функций: abs, labs, fabs, fadsf. Использование этих функций определялось типами данных обрабатываемых чисел. Но все они выполняли одно и то же действие – вычисляли абсолютное значение аргумента. Это доставляло определенные неудобства.
В языке C++ появилось понятие перегруженных (перегружаемых) функций, которое позволило избавиться от этого неудобства.
Перегруженными функциями называются функции, имеющие одинаковые имена, но различающиеся количеством, типами данных или порядком следования разнотипных параметров. Например:
void f (char c)
{
…….
}
void f (int c)
{
…….
}
int f (char c, int i)
{
…….
}
void f (int c, char i)
{
…….
}
void f (char c, char i)
{
…….
}
При вызове таких функций компилятор сам определяет, какую из этих функций необходимо использовать применительно к использованному при вызове списку аргументов. Чтобы у компилятора не возникало “сомнений” по поводу выбора подходящего варианта перегруженной функции, списки параметров перегруженных функций должны однозначно различаться.
Нельзя перегружать функции, различающиеся только типами данных возвращаемых значений. Например, компилятор “не разрешит” перегрузить следующую функцию:
int f (char c, char i)
{
…….
}
Это объясняется тем, что функции можно вызывать без использования возвращаемого функцией значения. При таком вызове функций с совпадающим списком параметров компилятор не сможет определить, какую из функций использовать.