C++ Функция

Функции — это набор инструкций, которые вместе выполняют задачу. Каждая программа на C++ имеет как минимум одну функцию — главную функциюmain(), и все простейшие программы могут определять дополнительные функции.

Вы можете разделить свой код на разные функции. Как разделить код на разные функции — решать вам, но логически разделение обычно основано на том, что каждая функция выполняет определённую задачу.

ФункцияОбъявлениеСообщает компилятору имя функции, возвращаемый тип и параметры. ФункцияопределениеПредоставляет фактическое тело функции.

Стандартная библиотека C++ предоставляет большое количество встроенных функций, которые программы могут вызывать. Например, функцияstrcat()Функция, используемая для объединения двух строк.memcpy()Используется для копирования памяти в другое место.

Функции также имеют много других названий, таких как методы, подпрограммы или процедуры, и так далее.

Определение функции

Общая форма определения функции в C++ выглядит следующим образом:

return_type function_name( список параметров ) { тело of the функции }

В C++ функция состоит из заголовка функции и тела функции. Ниже приведён список всех компонентов функции:

  • Возвращаемый тип:Функция может возвращать значение.return_typeЭто тип данных значения, возвращаемого функцией. Некоторые функции выполняют требуемые операции, не возвращая значение; в этом случае return_type — это ключевое словоvoid。
  • Имя функции:Это фактическое имя функции. Имя функции и список параметров вместе образуют сигнатуру функции.
  • Параметры:Параметры похожи на заполнители. Когда функция вызывается, вы передаёте значение параметру; это значение называется фактическим аргументом. Список параметров включает типы, порядок и количество параметров функции. Параметры необязательны, то есть функция может не содержать параметров.
  • Тело функции:Тело функции содержит набор инструкций, которые определяют задачу, выполняемую функцией.

Пример

Ниже приведён исходный код функцииmax(). Эта функция имеет два параметра, num1 и num2, и возвращает большее из двух чисел:

// Функция возвращает большее из двух чисел int max(int num1, int num2) { // Объявление локальной переменной int result; if (num1 > num2) result = num1; else result = num2; return result; }

Объявление функции

ОбъявлениефункцииСообщает компилятору имя функции и способ её вызова. Фактическое тело функции можно определить отдельно.

Объявление функции состоит из следующих частей:

return_type function_name( parameter list );

Для функции max(), определённой выше, объявление функции выглядит так:

int max(int num1, int num2);

В объявлении функции имена параметров не важны; требуются только типы параметров. Поэтому следующее также является допустимым объявлением:

int max(int, int);

Когда вы определяете функцию в одном исходном файле, а вызываете её в другом файле, требуется объявление функции. В этом случае следует объявить функцию в начале файла, который вызывает эту функцию.

Вызов функции

При создании функции C++ вы определяете, что делает функция, а затем вызываете функцию для выполнения поставленной задачи.

Когда программа вызывает функцию, управление программой передаётся вызываемой функции. Вызываемая функция выполняет определённую задачу. Когда выполняется оператор return функции или достигается закрывающая фигурная скобка функции, управление программой возвращается вызывающей программе.

При вызове функции передайте необходимые аргументы. Если функция возвращает значение, вы можете сохранить возвращаемое значение. Например:

Пример

#include <iostream> using namespace std; // Объявление функции int max(int num1, int num2); int main () { // Объявление локальной переменной int a = 100; int b = 200; int ret; // Вызов функции для получения максимального значения ret = max(a, b); cout << "Максимальное значение: " << ret << endl; return 0; } // Функция возвращает большее из двух чисел int max(int num1, int num2) { // Объявление локальной переменной int result; if (num1 > num2) result = num1; else result = num2; return result; }

Объедините функцию max() и функцию main() и скомпилируйте исходный код. Когда итоговый исполняемый файл будет запущен, он выдаёт следующие результаты:

Max value is : 200

Параметры функции

Если функция должна использовать параметры, она должна объявить переменные, которые принимают значения параметров. Эти переменные называются формальными параметрами функции.Формальные параметры。

Формальные параметры подобны другим локальным переменным внутри функции; они создаются при входе в функцию и уничтожаются при выходе из неё.

При вызове функции существует три способа передачи аргументов функции:

Тип вызоваОписание
Передача по значениюЭтот метод присваивает фактическое значение аргумента формальному параметру функции. В этом случае изменение формального параметра внутри функции не влияет на фактический аргумент.
Передача по указателюЭтот метод присваивает адрес аргумента формальному параметру. Внутри функции адрес используется для доступа к фактическому аргументу, переданному при вызове. Это означает, что изменение формального параметра влияет на фактический аргумент.
Передача по ссылкеЭтот метод присваивает ссылку на аргумент формальному параметру. Внутри функции ссылка используется для доступа к фактическому аргументу, переданному при вызове. Это означает, что изменение формального параметра влияет на фактический аргумент.

По умолчанию C++ используетвызов по значениюдля передачи параметров. В общем, это означает, что код внутри функции не может изменить аргументы, использованные для вызова функции. В примере, упомянутом ранее, тот же метод использовался при вызове функции max().

Значения параметров по умолчанию

При определении функции можно указать значение по умолчанию для каждого из параметров, следующих в списке параметров. При вызове функции, если фактический аргумент оставлен пустым, используется это значение по умолчанию.

Это делается с помощью оператора присваивания в определении функции для присвоения значений параметрам. При вызове функции, если для параметра не передано значение, используется значение по умолчанию; если значение указано, значение по умолчанию игнорируется и используется переданное значение. См. следующий пример:

Пример

#include <iostream> using namespace std; int sum(int a, int b=20) { int result; result = a + b; return (result); } int main () { // Объявление локальной переменной int a = 100; int b = 200; int result; // Вызов функции для добавления значения result = sum(a, b); cout << "Общее значение :" << result << endl; // Повторный вызов функции result = sum(a); cout << "Общее значение :" << result << endl; return 0; }

Когда приведенный выше код скомпилирован и выполнен, он выдает следующие результаты:

Total value is :300
Total value is :120

Лямбда-функции и выражения

C++11 поддерживает анонимные функции, называемые лямбда-функциями (также называемыми лямбда-выражениями).

Лямбда-выражения рассматривают функции как объекты. Лямбда-выражения можно использовать как объекты, например, их можно присваивать переменным и передавать в качестве аргументов, а также вызывать как функции.

Лямбда-выражения по сути очень похожи на объявления функций. Конкретная форма лямбда-выражения выглядит следующим образом:

[capture](parameters)->return-type{body}

Например:

[](int x, int y){ return x < y ; }

Если возвращаемое значение отсутствует, это можно выразить так:

[capture](parameters){body}

Например:

[]{ ++global_x; } 

В более сложном примере тип возвращаемого значения можно явно указать следующим образом:

[](int x, int y) -> int { int z = x + y; return z + x; }

В этом примере создается временный параметр z для хранения промежуточного результата. Как и в обычной функции, значение z не сохраняется до следующего вызова этой безымянной функции.

Если лямбда-функция не возвращает значение (например, void), ее тип возвращаемого значения можно полностью опустить.

Внутри лямбда-выражения можно обращаться к переменным текущей области видимости; это поведение замыкания лямбда-выражений. В отличие от замыканий JavaScript, в C++ передача переменных различает передачу по значению и передачу по ссылке. Это можно указать с помощью предшествующих []:

[]      // 沒有定义任何变量。使用未定义变量会引发错误。
[x, &y] // x以传值方式传入(默认),y以引用方式传入。
[&]     // 任何被使用到的外部变量都隐式地以引用方式加以引用。
[=]     // 任何被使用到的外部变量都隐式地以传值方式加以引用。
[&, x]  // x显式地以传值方式加以引用。其余变量以引用方式加以引用。
[=, &z] // z显式地以引用方式加以引用。其余变量以传值方式加以引用。

Еще одна вещь, которую следует отметить. Для форм [=] или [&] лямбда-выражение может напрямую использовать указатель this. Однако в случае формы [], если вы хотите использовать указатель this, его нужно передать явно:

[this]() { this->someFunc(); }();
Другие расширения