Функции в C++

Функции в C++: объявление, возвращаемое значение, параметры по значению и по ссылке, перегрузка и рекурсия.

Функция — именованный блок кода, который можно вызывать многократно. Это главный инструмент борьбы с дублированием.

Объявление и вызов

#include <iostream>

// тип_возврата имя(параметры) { тело }
int add(int a, int b) {
    return a + b;
}

int main() {
    int result = add(3, 4);
    std::cout << "Сумма: " << result << "\n";
    return 0;
}

Вывод:

Сумма: 7

Функция без возвращаемого значения имеет тип void:

void greet(std::string name) {
    std::cout << "Привет, " << name << "!\n";
}
// greet("Аня");  →  Привет, Аня!

Передача по значению и по ссылке

По умолчанию параметры передаются по значению — функция получает копию. Изменения не затрагивают оригинал.

#include <iostream>

void doubleVal(int x) {
    x *= 2;       // меняем копию
}

void doubleRef(int &x) {  // & — передача по ссылке
    x *= 2;       // меняем оригинал
}

int main() {
    int a = 5;
    doubleVal(a);
    std::cout << a << "\n";   // 5 — не изменилось

    doubleRef(a);
    std::cout << a << "\n";   // 10 — изменилось!
    return 0;
}

Вывод:

5
10

Передавайте большие объекты по константной ссылке const T& — без копирования, но без риска изменить оригинал.

Перегрузка функций

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

#include <iostream>

int    area(int side)            { return side * side; }
double area(double width, double height) { return width * height; }

int main() {
    std::cout << area(4)          << "\n";   // 16 — квадрат
    std::cout << area(3.0, 4.5)   << "\n";   // 13.5 — прямоугольник
    return 0;
}

Вывод:

16
13.5

Рекурсия

Функция может вызывать саму себя. Обязательно нужно базовое условие выхода, иначе — бесконечная рекурсия и переполнение стека.

#include <iostream>

int factorial(int n) {
    if (n <= 1) return 1;     // базовый случай
    return n * factorial(n - 1);
}

int main() {
    std::cout << factorial(5) << "\n";  // 5! = 120
    return 0;
}

Вывод:

120

Коротко

  • Функция: тип имя(параметры) { return ...; }. Без возврата — void.
  • По значению — копия; по ссылке (&) — оригинал.
  • Перегрузка: одно имя, разные сигнатуры — компилятор разберётся.
  • Рекурсия требует базового условия выхода, иначе — stack overflow.
Проверьте себя
1. Что происходит при передаче параметра по значению?
AФункция работает с оригиналом
BФункция получает копию — изменения не затрагивают оригинал
CПередаётся адрес переменной
DКомпилятор выдаёт предупреждение
2. Какой тип возврата у функции, которая ничего не возвращает?
Anull
Bempty
Cvoid
Dnone
3. Что такое перегрузка функций?
AФункция, которая вызывает саму себя
BНесколько функций с одним именем, но разными параметрами
CФункция с более чем 10 параметрами
DОбъявление функции без тела
Поддержать проект