Глава 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++ - мощный инструмент для структурирования и организации кода. Понимание различных аспектов работы с функциями позволит вам писать более чистый, эффективный и читаемый код.