Функции#
Введение#
Функции являются фундаментальным компонентом программирования на C++, упаковывая фрагменты кода в многократно используемые, эффективные разделы, предназначенные для выполнения конкретной задачи. Функции могут вызываться несколько раз в программе, что упрощает организацию кода и помогает избежать повторного использования кода. Функции также упрощают отладку кода.
На этой странице рассматриваются основы использования функций в C++, включая:
Структура и синтаксис функций — Как пишутся функции в C++, включая типы возвращаемых значений, имена и параметры.
Прототипы функций — Что такое прототипные функции и зачем они используются.
Определение и вызов функций — Как создавать функции и вызывать их из вашей программы.
Возвращаемые значения — Как функции могут отправлять данные обратно вызывающей стороне.
Передача по ссылке — Как функции могут изменять переменные за пределами своей собственной области видимости.
Функции обратного вызова — Как функции могут передаваться в другие функции и автоматически вызываться в ответ на события.
Функции с аргументами по умолчанию — Как параметрам можно присвоить значения по умолчанию, если аргумент не указан.
Структура и синтаксис функций#
В C++ функции должны быть объявлены с указанием типа возвращаемого значения, имени и параметров. Базовый синтаксис выглядит следующим образом:
return_type function_name(parameters) {
// Code to execute when the function is called
return result; // Optional, used to return a value
}
Функциональные части |
Описание |
|---|---|
|
Тип данных, возвращаемый функцией, некоторые распространенные варианты:
|
|
Название функции. |
|
Необязательно. Разделенный запятыми список типизированных параметров, записанный как |
|
Optional. The value returned by the function. If the function’s |
Примечание: Функция всегда должна быть объявлена до ее вызова, или вы должны предоставить прототип функции.
Функциональные прототипы#
В C++ код читается сверху вниз. Это означает, что функция должна быть известна компилятору до того, как её можно будет вызвать.
Прототип функции позволяет использовать функцию до написания её полного кода. Это позволяет размещать main() в начале программы, а определения функций — позже, где их легче организовать и прочитать.
Без прототипа вам пришлось бы определять каждую функцию выше main(), что может затруднить отслеживание проекта по мере его развития.
// The function's prototype
void greeting();
int main() {
greeting();
}
// Write the function's body after
void greeting() {
Brain.Screen.print("Hello!");
}
Определение и вызов функций#
Functions with No Parameters#
Если функция не требует входных данных, её можно определить без параметров. Если функция не возвращает значение, используйте тип возвращаемого значения void.
// Define a function to display a message
void greeting() {
Brain.Screen.print("Hello!");
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Call the function to display the message
greeting();
}
Functions with Parameters#
Также можно добавлять параметры к функциям, что позволяет передавать информацию, которую функция будет использовать.
Примечание: Текст можно передавать с помощью строк в стиле C (const char*) или строк C++ (std::string).
// Define a function with a parameter
void namedGreeting(const char* name) {
Brain.Screen.print("Hello, %s!", name);
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
namedGreeting("Stranger");
}
Возвращаемые значения#
Функции могут отправлять данные обратно вызывающей стороне, используя ключевое слово `return ). Это позволяет перехватывать и использовать выходные данные в вашем проекте.
// Define a function that multiplies numbers by 2
int timesTwo(int number) {
return number * 2;
}
int main() {
// Initializing Robot Configuration. DO NOT REMOVE!
vexcodeInit();
// Display the return value
Brain.Screen.print("%d", timesTwo(2));
}
Проходя мимо ссылки#
По умолчанию в C++ параметры функции передаются по значению, то есть функция получает копию исходной переменной. Изменения, внесенные внутри функции, не влияют на исходное значение.
// Add 1 to the number
void addOne(int number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will still be 5
}
Чтобы функция могла изменять исходную переменную, параметры можно передавать по ссылке, используя символы &.
// Add 1 to the number
void addOne(int& number) {
number++;
}
int main() {
int value = 5;
addOne(value);
// "value" will now be 6
}
Передача по ссылке позволяет функциям обновлять переменные, определенные вне функции, без возврата значения.
Функции обратного вызова#
Функция обратного вызова — это функция, которая передается в другую функцию и вызывается автоматически при возникновении определенного события.
Обратные вызовы обычно используются для обработки таких событий, как нажатия кнопок или обновления данных с датчиков.
Вместо того чтобы вызывать функцию самостоятельно, проект вызывает её за вас при возникновении события.
void onPressed() {
Brain.Screen.print("Screen pressed!");
}
// Call onPressed whenever the screen is pressed
int main() {
vexcodeInit();
Brain.Screen.pressed(onPressed);
}
Callback Signatures#
Каждая функция обратного вызова должна соответствовать определенной сигнатуре, которая определяет:
Тип возвращаемого значения
Количество параметров
Типы параметров
Требуемая подпись определяется API. Функция обратного вызова должна точно соответствовать этой подписи.
// This callback function cannot include any parameters
void callback(void);
// This callback function includes four parameters
void callback(axisType axis, double x, double y, double z);
Названия параметров являются описательными и могут различаться, но тип возвращаемого значения, порядок параметров и типы параметров должны точно совпадать.
Функции с аргументами по умолчанию#
Функции могут задавать значения по умолчанию для одного или нескольких параметров. Аргумент по умолчанию используется, если при вызове функции для этого параметра не указано значение.
Правила для аргументов по умолчанию:
Аргументы по умолчанию должны быть последними параметрами в определении функции.
Если параметру присвоено значение по умолчанию, то все параметры после него также должны иметь значения по умолчанию.
Если функция указывает аргументы по умолчанию в своем прототипе, эти значения по умолчанию не должны указываться повторно в определении функции.
// Required parameter first, default parameter last
void greeting(const char* name, int repeatCount = 1) {
for (int i = 0; i < repeatCount; i++) {
Brain.Screen.print("Hello, %s!", name);
Brain.Screen.newLine();
}
}
int main() {
vexcodeInit();
// Say what name to greet (V5) and
// use default value for repeatCount (1)
greeting("V5");
Brain.Screen.newLine();
// Overrides the default value to 3
greeting("V5", 3);
}