- •Предисловие
- •Глава 1. Основные понятия
- •1.1. Элементы языка программирования
- •1.2. Процесс создания программы
- •1.3. Первая программа
- •1.4. Состав программы
- •Глава 2. Средства разработки на C++
- •2.1. Системы Turbo C++ 3.0/Borland C++ 3.1
- •2.2. Система C++ Builder
- •Глава 3. Работа с числовыми данными
- •3.1. Целые типы
- •3.2. Числа с плавающей точкой
- •3.3. Ввод и вывод чисел
- •3.4. Логический тип и логические операции
- •3.5. Математические функции
- •Глава 4. Операторы. Ключевые слова
- •4.1. Операторы
- •4.2. Приоритеты операторов
- •4.3. Ключевые слова
- •4.4. Структура программы
- •4.5. Константы
- •Задачи - . Простейшие вычисления
- •Глава 5. Управление и циклы
- •5.1. Условный оператор
- •5.2. Операторы цикла
- •5.3. Переключатель
- •5.4. Операторы break и continue
- •Задачи -. Выбор и циклы
- •Глава 6. Массивы
- •6.1. Одномерные массивы
- •6.2. Двумерные массивы
- •Задачи -. Одно- и двумерные массивы
- •Глава 7. Функции
- •7.1. Определение функции
- •7.2. Формальные параметры и фактические аргументы
- •7.3. Автоматические и статические переменные
- •7.4. Прототипы функций
- •7.5. Массивы как аргументы функций
- •7.6. Внешние переменные
- •7.7. Рекурсия
- •7.8. Перегруженные имена функций
- •7.9. Аргументы функций по умолчанию
- •Задачи -. Функции
- •Глава 8. Символы и строки
- •8.1. Символы
- •8.2. Строки символов
- •Задачи -. Символы и строки
- •Глава 9. Препроцессор
- •9.1. Директивы препроцессора
- •9.2. Макросы
- •Задачи -. Макросы
- •Глава 10. Указатели и ссылки
- •10.1. Указатели и адреса
- •10.2. Указатели и массивы
- •10.3. Адресная арифметика
- •10.4. Символьные указатели
- •10.5. Массивы указателей
- •10.6. Указатели на функции
- •10.7. Ссылки
- •10.8. Операторы new и delete
- •Задачи -. Указатели и ссылки
- •Глава 11. О файлах и командной строке
- •11.1. Знакомство с файлами
- •11.2. Командная строка
- •11.3. Перенаправление стандартного ввода и вывода на файл
- •11.4. Аргументы командной строки
- •Задачи -. Файлы и командная строка
- •Глава 12. Работа с экраном дисплея
- •12.1. Текстовый режим
- •12.2. Графический режим
- •Задачи -. Работа с экраном
- •Глава 13. Внутреннее представление чисел
- •13.1. Двоичная система счисления
- •13.2. Беззнаковые целые
- •13.3. Двоичный дополнительный код
- •13.4. Двоичный код с избытком
- •13.5. Побитовые операторы
- •13.6. Дробные числа в двоичной системе
- •13.7. Внутреннее представление плавающих типов
- •13.8. Преобразование типов
- •Задачи -. Побитовые операторы
- •Глава 14. Структуры, перечисления, объединения
- •14.1. Объявление структур
- •14.2. Структуры и функции
- •14.3. Указатели на структуры
- •14.4. Массивы структур
- •14.5. Перечисления
- •14.6. Объединения
- •14.7. Битовые поля
- •14.8. О бинарных файлах
- •Задачи -. Структуры
- •Глава 15. Классы
- •15.1. Структуры в C++. Инкапсуляция
- •15.2. Встроенные функции
- •15.3. Классы. Скрытие данных
- •15.4. Конструкторы
- •15.5. Статические члены класса
- •15.6. Друзья класса
- •15.7. Копирование объектов класса
- •15.8. Управление доступом
- •15.9. Ссылка на себя
- •15.10. Деструкторы
- •Задачи -. Работа с классами
- •Глава 16. Программы из нескольких файлов
- •16.1. Работа с проектами
- •16.2. Область действия имен
- •16.3. Заголовочные файлы
- •16.4. Пространства имен
- •Задачи -. Работа со стеком
- •Глава 17. Перегрузка операторов
- •17.1. Правила перегрузки операторов
- •Задачи -. Перегрузка операторов
- •Глава 18. Конструктор копирования и оператор присваивания
- •18.1. Проблемы при копировании
- •Задачи -. Конструктор копирования
- •Глава 19. Ввод и вывод
- •19.1. Вывод
- •19.2. Ввод
- •19.3. Ввод и вывод определяемых пользователем типов
- •19.4. Работа с файлами
- •Глава 20. Взаимоотношения классов
- •20.1. Объекты как члены класса
- •20.2. Конструкторы встроенных типов
- •20.3. Наследование
- •20.4. Виртуальные функции
- •20.5. Абстрактные классы
- •20.6. Совместимость типов
- •20.7. Множественное наследование
- •Задачи -. Наследование классов
- •Глава 21. Шаблоны, исключения
- •21.1. Шаблоны
- •21.2. Шаблоны функций
- •21.3. Классы и шаблоны
- •21.4. Обработка исключений
- •21.5. Стандартная библиотека шаблонов
- •Литература
- •Предметный указатель
84
Глава 7. Функции
Термином функции в языке С++ называют подпрограммы. В виде функций оформляются вычисления, преобразования, другие действия, которые затем могут быть выполнены неоднократно с различными аргументами.
7.1. Определение функции
Определение любой функции имеет вид:
тип-результата имя-функции(объявления аргументов)
{
объявления и инструкции
}
Отдельные части определения могут отсутствовать, например, следующая функция ничего не делает:
void dummy() {}
Тип результата функции void означает, что функция ничего не возвращает.
Вычисления в функции завершаются при достижении последней закрывающей фигурной скобки } или при выполнении инструкции return. Когда функция завершает работу, управление передается в вызывающую программу той инструкции, которая следует за вызовом функции.
Если функция завершается инструкцией return выр;
то вычисляется выражение выр и его значение передается в вызывающую программу в точку вызова функции. Значение, возвращаемое функцией, может быть использовано вызывающей программой или проигнорировано.
Функции могут возвращать значения любых типов. Например, следующая функция возвращает логическое значение true (истина), если ее аргумент a больше b, иначе значением функции будет false (ложь).
bool greater(int a, int b)
{
return a > b;
}
Функции 85
7.2. Формальные параметры и фактические аргументы
Аргументы, используемые при определении функции, называются формальными параметрами. Рассмотрим, например, функцию, вычисляющую сумму своих аргументов:
int sum(int a, int b)
{
return a + b;
}
Здесь a и b – формальные параметры функции sum.
При вызове функции вместо формальных параметров подставляются фактические аргументы. Например, нашу функцию sum можно использовать следующим образом:
#include <iostream.h> int main()
{
cout << ”3 + 2 = ” << sum(3, 2); int x = 3, y = 2;
cout << ”\nx + y = ” << sum(x, y); return 0;
}
Впервом случае фактическими аргументами являются константы 3
и2, во втором – переменные x и y.
Приведенную программу можно выполнить, разместив в одном файле сначала функцию sum, а затем функцию main. Программа напечатает:
3 + 2 = 5 x + y = 5
В языках Си и C++ аргументы передаются в функцию по значению. Это значит, что внутри функции создаются локальные копии фактических аргументов, которые и используются в вычислениях. Отсюда следует, что фактические аргументы не могут быть непосредственно изменены внутри функции. Рассмотрим функцию:
void add(int c)
{
c++;
}
На первый взгляд, функция add увеличивает свой аргумент на 1, попробуем применить ее:
86 7
#include <iostream.h> int main()
{
int x = 1;
add(x); cout << ”x = ” << x; add(2);
return 0;
}
Здесь производится попытка увеличить переменную x на 1 и попытка изменить значение константы 2. Программа напечатает:
x = 1
Таким образом, значение аргумента x не изменилось, так же, как ничего не произошло с константой 2. Просто при первом вызове add формальный параметр c был инициализирован значением переменной x, а во втором – константой 2. Внутри функции add переменная c изменяется, что никак не сказывается ни на x, ни на константе 2.
Память под формальные параметры функции выделяется при вызове функции и освобождается при завершении ее работы.
Если необходимо изменить фактический аргумент внутри функции, в нее должен передаваться адрес аргумента или ссылка на аргумент. Как это сделать, будет описано позже.
Пpограмма.14. Степени целых чисел
В приводимой ниже программе определена функция power для возведения целого m в целую степень n. В main функция power вызывается для вычисления степеней чисел 2 и –3.
//Файл PowerInt.cpp
//Функция power возводит m в степень n
int power(int m, int n) // power - имя функции; m, n - аргументы функции
{
int i, p = 1; |
|
for(i = 1; i <= n; i++) |
// m возводится |
p = p * m; |
// в n-ю степень |
return p; |
// Возвращение вычисленного значения |
} |
|
#include <iostream.h> |
|
#include <conio.h> |
|
int main() |
// Использование функции power |
{ |
|
int i; |
|
for(i = 1; i < 10; i++) |
|
Функции 87
cout << "2 в степ. " << i << " =\t" << power(2, i)
<< "\t-3 в степ. " << i << " =\t" << power(-3, i) << "\n"; getch();
return 0;
}
Программа выдает следующее:
2 в степ. 1 = |
2 |
-3 в степ. 1 = |
-3 |
|
2 в степ. 2 = |
4 |
-3 в степ. 2 = |
9 |
|
2 в степ. 3 = |
8 |
-3 в степ. 3 = |
-27 |
|
2 в степ. 4 = |
16 |
-3 в степ. 4 = |
81 |
|
2 в степ. 5 = |
32 |
-3 в степ. 5 = |
-243 |
|
2 в степ. 6 = |
64 |
-3 |
в степ. 6 = |
729 |
2 в степ. 7 = |
128 -3 |
в степ. 7 = |
-2187 |
|
2 в степ. 8 = |
256 -3 |
в степ. 8 = |
6561 |
|
2 в степ. 9 = |
512 -3 |
в степ. 9 = |
-19683 |
В данной программе сначала идет определение функции power с двумя аргументами целого типа. Для вычисления mn величина p умножается n раз на m. Начальное значение p устанавливается в 1. Вычисленный результат возвращается из функции инструкцией:
return p;
Внутри функции power определены локальные переменные i и p. Они создаются (под них выделяется память) только в момент вызова функции, а при завершении работы функции память, занимавшаяся локальными переменными, освобождается. Это значит, что то место памяти, которое занимали i и p, может быть использовано для других переменных.
Функция main направляет значение, возвращаемое функцией power, в выходной поток.
Сама функция main вызывается на выполнение операционной системой, а возвращаемое ею значение может быть каким-либо образом использовано в среде ОС, например, для анализа успешности завершения программы.
Обратите внимание на использование символа табуляции ’\t’. Вывод символа табуляции переводит курсор в следующую позицию табуляции, которые во всех строках экрана находятся в одинаковых местах. Благодаря этому результаты вывода выравниваются по левому краю.