Функції#

Вступ#

Функції є фундаментальним компонентом програмування на C++, вони упаковують фрагменти коду в багаторазові, ефективні розділи коду, призначені для виконання певного завдання. Функції можна викликати кілька разів у програмі, що спрощує організацію коду та допомагає уникнути повторень коду. Функції також полегшують налагодження коду.

Ця сторінка охоплює основи використання функцій у C++, зокрема:

Структура та синтаксис функцій#

У C++ функції мають бути оголошені з типом повернення, іменем та параметрами. Основний синтаксис такий:

return_type function_name(parameters) {
  // Code to execute when the function is called
  return result;  // Optional, used to return a value
}

Функціональні частини

Опис

return_type

Тип даних, який повертає функція. Деякі поширені опції:

  • void — Нічого не повертає
  • int — Повертає ціле значення
  • double — Повертає число з плаваючою комою
  • bool — Повертає true або false
  • char — Повертає один символ
  • const char* — Повертає текстовий рядок
  • користувацькі типи — Повертає struct або об’єкт класу

function_name

Назва функції.

parameters

Необов’язково. Список типізованих параметрів, розділених комами, записаний як type name, де type вказує тип даних параметра, а name – це ідентифікатор, що використовується для доступу до цього значення всередині функції. Параметри отримують вхідні значення під час виклику функції.

result

Необов’язково. Значення, що повертається функцією. Якщо return_type функції не дорівнює void, це значення має бути надано, а його тип має точно відповідати зазначеному return_type.

Примітка: Функцію завжди потрібно оголошувати перед її викликом, або ви повинні надати прототип функції.

Прототипи функцій#

У C++ код читається зверху вниз. Це означає, що функція має бути відома компілятору, перш ніж її можна буде викликати.

Прототип функції дозволяє вам використовувати функцію до написання її повного коду. Це дозволяє вам зберігати main() ближче до початку програми, розміщуючи визначення функцій пізніше, де їх легше впорядкувати та читати.

Без прототипу вам довелося б визначати кожну функцію вище main(), що може ускладнити відстеження проектів у міру їх зростання.

Визначити прототип функції (поза int main())

// The function's prototype
void greeting();

Викликати функцію всередині int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  greeting();
}

Напишіть тіло функції після

void greeting() {
  Brain.Screen.print("Hello!");
}

Визначення та виклик функцій#

Functions with No Parameters#

Якщо функція не потребує вхідних даних, ви можете визначити її без параметрів. Використовуйте void як тип повернення, якщо функція не повертає значення.

Визначити функцію (поза int main())

// Define a function to display a message
void greeting() {
    Brain.Screen.print("Hello!");
}

Викликати функцію всередині int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Call the function to display the message
  greeting();
}

Functions with Parameters#

Ви також можете додавати параметри до функцій, які дозволяють передавати інформацію для використання функцією.

Примітка: Текст можна передавати за допомогою рядків у стилі C (const char*) або рядків C++ (std::string).

Визначити функцію (поза int main())

// Define a function with a parameter
void namedGreeting(const char* name) {
    Brain.Screen.print("Hello, %s!", name);
}

Викликати функцію з параметром всередині int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Call the function to display the message
  namedGreeting("Stranger");
}

Повернуті значення#

Функції можуть надсилати дані назад викликаючій функції за допомогою ключового слова return Це дозволяє вам записувати та використовувати вивід у вашому проєкті.

Визначити функцію (поза int main())

// Define a function that multiplies numbers by 2
int timesTwo(int number) {
    return number * 2;
}

Викликати функцію з параметром всередині int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Display the return value
  Brain.Screen.print("%d", timesTwo(2));
}

Передача за посиланням#

За замовчуванням C++ передає параметри функції за значенням, тобто функція отримує копію оригінальної змінної. Зміни, внесені всередині функції, не впливають на оригінальне значення.

Визначити функцію (поза int main())

// Add 1 to the number
void addOne(int number) {
  number++;
}

Викликати функцію з параметром всередині int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  int value = 5;
  addOne(value);
  // "value" will still be 5
}

Щоб дозволити функції змінювати оригінальну змінну, параметри можна передавати за посиланням, використовуючи символи &.

Визначити функцію (поза int main())

// Add 1 to the number
void addOne(int& number) {
  number++;
}

Викликати функцію з параметром всередині int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  int value = 5;
  addOne(value);
  // "value" will now be 6
}

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

Функції зворотного виклику#

Функція зворотного виклику — це функція, яка передається в іншу функцію та викликається автоматично, коли відбувається певна подія.

Зворотні виклики зазвичай використовуються для таких подій, як натискання кнопок або оновлення датчиків.

Замість того, щоб викликати функцію самостійно, проєкт викликає її за вас, коли відбувається подія.

Визначити функцію зворотного виклику (поза int main())

// Create a callback function
void onPressed() {
  Brain.Screen.print("Screen pressed!");
}

Зареєструйте зворотний виклик всередині int main()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Call onPressed whenever the screen is pressed
  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);

Назви параметрів є описовими та можуть відрізнятися, але тип повернення, порядок параметрів та типи параметрів повинні точно збігатися.

Функції з аргументами за замовчуванням#

Функції можуть визначати значення за замовчуванням для одного або кількох параметрів. Аргумент за замовчуванням використовується, коли під час виклику функції для цього параметра не надається значення.

Правила для аргументів за замовчуванням:

  • Аргументи за замовчуванням мають бути останніми параметрами у визначенні функції.

  • Щойно параметр має значення за замовчуванням, всі параметри після нього також повинні мати значення за замовчуванням.

  • Якщо функція визначає аргументи за замовчуванням у своєму prototype, ці значення за замовчуванням не повинні бути вказані знову у визначенні функції.

Визначити функцію (поза int main())

// 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()

int main() {
  /* vexcodeInit() is only required when using VEXcode.
  Remove vexcodeInit() if compiling in VS Code. */
  vexcodeInit();

  // Say what name to greet (EXP) and
  // use default value for repeatCount (1)
  greeting("EXP");

  Brain.Screen.newLine();

  // Overrides the default value to 3
  greeting("EXP", 3);
}

// 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 (EXP) and
    // use default value for repeatCount (1)
    greeting("EXP");

    Brain.Screen.newLine();

    // Overrides the default value to 3
    greeting("EXP", 3);
}