Функции

Функции - это блоки кода, которые можно многократно использовать в программе. Они позволяют разработчикам организовывать код, избегать его дублирования и упрощать логику программы.

тип_возвращаемого_значения имя_функции(параметры) { // Тело функции return значение; // (если тип не void) }
Пример:
int sum(int a, int b) { return a + b; } // Вызовы функции int result = sum(5, 3); // result = 8 int result = sum(2, 3); // result = 5 int result = sum(1, 7); // result = 8

Возвращаемые значения

  • Любой тип, включая пользовательские классы

  • void — если функция ничего не возвращает

  • return — завершает функцию

Пример с void:
void printHello() { cout << "Hello!"; // return не нужен }

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

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

В C++ есть несколько способов передать аргументы в функцию, рассмотрим их.

Передача по значению (копия):
void modify(int x) { x = 10; // Не влияет на оригинал } int main() { int a = 5; modify(a); cout << a; // 5 }
Передача по указателю:
void modify(int* x) { *x = 10; // Меняем оригинал } int main() { int a = 5; modify(&a); cout << a; // 10 }
Передача по ссылке (рекомендуется):
void modify(int& x) { x = 10; // Меняем оригинал } int main() { int a = 5; modify(a); cout << a; // 10 }

Параметры по умолчанию
void greet(string name = "Guest") { cout << "Hello, " << name << "!"; } greet(); // Hello, Guest! greet("Alice"); // Hello, Alice!

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


Перегрузка функций (Function Overloading)

Можно создать несколько функций с одним именем, но разными параметрами:

void print(int i) { cout << "Integer: " << i; } void print(double d) { cout << "Double: " << d; } print(5); // Integer: 5 print(3.14); // Double: 3.14

Как работает:
Компилятор выбирает версию по типу аргументов.


Указатели на функции

Функции можно хранить в переменных:

int add(int a, int b) { return a + b; } int sub(int a, int b) { return a - b; } int main() { int (*operation)(int, int); // Указатель на функцию operation = &add; cout << operation(3, 2); // 5 operation = ⊂ cout << operation(3, 2); // 1 }

Современная альтернатива: std::function (из <functional>)


Лямбда-функции (C++11 и выше)

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

Анонимные функции "на месте":

auto sum = [](int a, int b) { return a + b; }; cout << sum(2, 3); // 5
Захват переменных:
int x = 10; auto addX = [x](int a) { return a + x; }; cout << addX(5); // 15

Рекомендации

  1. Одна функция — одна задача

  2. Используйте осмысленные имена

  3. Избегайте длинных функций (оптимально 10-15 строк)

  4. Для сложных параметров используйте константные ссылки:

    void processBigObject(const BigObject& obj);
  5. Избегайте глобальных переменных — передавайте параметры явно


Комментарии

Добавить комментарий

Чтобы оставить комменатрий необходимо Авторизоваться