Функции

Глава 3. Функции #

1. Объявление и определение функций #

Функция в C++ - это блок кода, который выполняет определенную задачу и может быть вызван из других частей программы. Функция состоит из двух частей: объявления и определения.

Базовый синтаксис функции #

// Объявление функции
возвращаемый_тип имя_функции(список_параметров);

// Определение функции
возвращаемый_тип имя_функции(список_параметров) {
    // Тело функции
    // Код, который будет выполнен при вызове функции
}

Пример простой функции:

// Объявление
int add(int a, int b);

// Определение
int add(int a, int b) {
    return a + b;
}

// Вызов функции
int result = add(5, 3); // result будет равен 8

2. Параметры функций #

Передача параметров по значению #

void modifyValue(int x) {
    x = 10; // Изменение локальной копии параметра
}

int main() {
    int number = 5;
    modifyValue(number); // number останется равным 5
    return 0;
}

Передача параметров по ссылке #

void modifyReference(int& x) {
    x = 10; // Изменение оригинального значения
}

int main() {
    int number = 5;
    modifyReference(number); // number теперь равен 10
    return 0;
}

Параметры со значениями по умолчанию #

// Функция с параметрами по умолчанию
void printMessage(std::string message = "Привет, мир!") {
    std::cout << message << std::endl;
}

int main() {
    printMessage(); // Выведет "Привет, мир!"
    printMessage("Другое сообщение"); // Выведет "Другое сообщение"
    return 0;
}

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

Типы возвращаемых значений #

// Возврат простого типа
int calculateSum(int a, int b) {
    return a + b;
}

// Возврат ссылки
int& getElement(std::vector<int>& vec, int index) {
    return vec[index];
}

// Возврат структуры или класса
struct Point {
    int x, y;
};

Point createPoint(int x, int y) {
    return {x, y};
}

Ключевое слово void #

// Функция без возвращаемого значения
void printGreeting() {
    std::cout << "Привет!" << std::endl;
}

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

Перегрузка позволяет создавать несколько функций с одним именем, но разными параметрами:

int add(int a, int b) {
    return a + b;
}

double add(double a, double b) {
    return a + b;
}

std::string add(const std::string& a, const std::string& b) {
    return a + b;
}

int main() {
    std::cout << add(5, 3);          // Вызовет версию для int
    std::cout << add(5.5, 3.7);       // Вызовет версию для double
    std::cout << add("Привет", " мир"); // Вызовет версию для string
    return 0;
}

5. Встраиваемые функции (inline) #

Встраиваемые функции используются для оптимизации производительности:

// Объявление inline функции
inline int multiply(int a, int b) {
    return a * b;
}

int main() {
    // Компилятор может заменить вызов функции её телом
    int result = multiply(4, 5); // Эквивалентно int result = 4 * 5;
    return 0;
}

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

Указатели на функции позволяют хранить и передавать ссылки на функции:

// Объявление типа указателя на функцию
typedef int (*MathOperation)(int, int);

int add(int a, int b) {
    return a + b;
}

int subtract(int a, int b) {
    return a - b;
}

int main() {
    // Создание указателя на функцию
    MathOperation operation = add;
    std::cout << operation(5, 3); // Выведет 8

    // Смена указателя
    operation = subtract;
    std::cout << operation(5, 3); // Выведет 2

    return 0;
}

7. Лямбда-функции #

Лямбда-функции - это анонимные функции, которые можно определить inline:

#include <algorithm>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5};

    // Лямбда-функция для умножения каждого элемента на 2
    std::transform(numbers.begin(), numbers.end(), numbers.begin(), 
        [](int x) { return x * 2; });

    // Лямбда-функция с захватом переменных
    int multiplier = 3;
    auto multiplyBy = [multiplier](int x) { return x * multiplier; };

    // Лямбда-функция с разными типами захвата
    int base = 10;
    auto complexLambda = [&]() { // захват всех локальных переменных по ссылке
        base += 5;
        return base;
    };

    return 0;
}

Основные режимы захвата лямбда-функций: #

  • [] - пустой список захвата
  • [=] - захват всех локальных переменных по значению
  • [&] - захват всех локальных переменных по ссылке
  • [x, &y] - захват x по значению, y по ссылке

Заключение #

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