Для выполнения своего предназначения функции принимают аргументы и, как правило, возвращают результат. В этом разделе мы рассмотрим механизмы передачи аргументов.
8.5.1. Объявление аргументов и тип возвращаемого значения
Функции в языке С++ используются для названия и представления вычислений и действий. Объявление функции состоит из типа возвращаемого значения, за которым следует имя функции и список формальных аргументов. Рассмотрим пример.
double fct(int a, double d); // объявление функции fct (без тела)
double fct(int a, double d) { return a*d; } // объявление функции fct
Определение состоит из тела функции (инструкций, выполняемых при ее вызове), в то время как объявление, не являющееся определением, просто завершается точкой с запятой. Формальные аргументы часто называют
int current_power(); // функция current_power не имеет аргументов
Если хотите, чтобы функция не возвращала никаких значений, укажите вместо типа возвращаемого значения ключевое слово void
. Например:
void increase_power(int level); // функция increase_power
// ничего не возвращает
Здесь ключевое слово void
означает “ничего не возвращает”. Параметры можно как именовать, так и не именовать. Главное, чтобы объявления и определения были согласованы друг с другом. Рассмотрим пример.
// поиск строки s в векторе vs;
// vs[hint] может быть подходящим местом для начала поиска
// возвращает индекс найденного совпадения; –1 означает "не найдена"
int my_find(vector
// аргументы
int my_find(vector
my_find()
так же правильно, как и первое: оно содержит всю информацию, необходимую для ее вызова.
Как правило, все аргументы в объявлении имеют имена. Рассмотрим пример.
int my_find(vector
// поиск строки s в векторе vs, начиная с позиции hint
{
if (hint<0 || vs.size()<=hint) hint = 0;
for (int i = hint; i
// с позиции hint
if (vs[i]==s) return i;
if (0
for (int i = 0; i
if (vs[i]==s) return i;
}
return –1;
}
Переменная hint
немного усложняет код, но она введена на основании предположения, что пользователю может быть примерно известно, где в векторе находится строка. Однако представим себе, что мы использовали my_find()
, а затем выяснили, что пользователи редко используют переменную hint
, так что она лишь снижает производительность программы. В таком случае переменная hint
больше не нужна, но за пределами нашего фрагмента есть множество вызовов функции my_find()
с аргументом hint
. Переписывать код мы не хотим (или не можем), поэтому изменять объявления функции my_find()
не будем. Вместо этого мы просто не будем использовать последний аргумент. Поскольку мы его не используем, оставим его без имени.
int my_find(vector
// не используется
{
for (int i = 0; i
if (vs[i]==s) return i;
return –1;
}
Полная грамматика объявлений функций изложена в книге
8.5.2. Возврат значения
Функция возвращает вычисленное значение с помощью инструкции return
.
T f() // функция f() возвращает объект класса T
{
V v;
// ...
return v;
}
T x = f();
Здесь возвращаемое значение — это именно то значение, которые мы получили бы при инициализации переменной типа T
значением типа V
.
V v;
// ...
T t(v); // инициализируем переменную t значением v
Таким образом, возвращаемое значение — это форма инициализации. Функция, объявившая возвращение значения, должна его возвращать. Например, в следующем фрагменте возникает ошибка: