C++ 函数

C++ 中的函数是执行特定任务的自包含代码块,用于组织代码、简化重复任务和提高代码的可维护性。函数的定义、调用、参数传递、返回值等方面构成了 C++ 函数的基础。下面我们会全面讲解 C++ 函数的概念、类型、参数传递方式、递归、函数重载、内联函数、模板函数等多个方面。

1. 函数的定义和调用

1.1 函数定义

C++ 中函数的定义一般包括以下几部分:

  • 返回类型:函数执行完成后返回的数据类型。
  • 函数名:标识函数的名称,用于函数的调用。
  • 参数列表:传递给函数的参数,写在圆括号内。如果没有参数,参数列表为空。
  • 函数体:函数的代码块,定义函数执行的操作。

格式如下:

示例:

1.2 函数声明

函数声明(也称为函数原型)用于告知编译器函数的存在,声明时不需要函数体,只需要函数的返回类型、函数名、参数类型。

2. 函数的参数

C++函数可以接收输入参数并返回值。

2.1 参数传递方式

C++ 支持三种参数传递方式:

  • 按值传递(Pass by Value)
  • 按引用传递(Pass by Reference)
  • 按指针传递(Pass by Pointer)

接下来依次进行讲解

2.1.1 按值传递

按值传递是将参数的副本传递给函数,函数内部对参数的修改不会影响原变量。

如下所示:

cpp 复制代码
void modify(int a) {
    a = 10;  // 修改的是副本,不会影响外部的a
}

int main() {
    int x = 5;
    modify(x);
    cout << x << endl;  // 输出5
    return 0;
}

这里面,相当于是有创建一个变量,将值赋给这个新的变量,原变量不会有任何修改。

2.1.2 按引用传递

按引用传递将变量本身的引用传递给函数,函数内部的修改会直接影响原变量。

cpp 复制代码
void modify(int& a) {
    a = 10;  // 修改引用,直接影响外部变量
}

int main() {
    int x = 5;
    modify(x);
    cout << x << endl;  // 输出10
    return 0;
}
2.1.3 按指针传递
cpp 复制代码
void modify(int* a) {
    *a = 10;  // 使用指针修改外部变量的值
}

int main() {
    int x = 5;
    modify(&x);  // 传递x的地址
    cout << x << endl;  // 输出10
    return 0;
}

2.2 默认参数

函数可以为参数提供默认值,调用时可以省略这些参数。

cpp 复制代码
int add(int a, int b = 5) {  // b 的默认值为5
    return a + b;
}

int main() {
    cout << add(10) << endl;  // 输出15,b 使用默认值
    cout << add(10, 20) << endl;  // 输出30,b 被覆盖
    return 0;
}

⭐注意:默认赋值从右向左开始,顺序不能错,并且中间不能中断。

3. 函数的返回值

函数的返回值是函数执行后的结果。返回值的类型必须与函数定义中的返回类型一致。如果函数不需要返回值,返回类型可以是 void

cpp 复制代码
void display() {  // 没有返回值的函数
    cout << "Hello, World!" << endl;
}

3.1 多种返回类型

C++ 支持返回基础数据类型、引用、指针甚至对象等多种类型。

cpp 复制代码
int add(int a, int b) {
    return a + b;  // 返回值为整数
}

上面只给出了一个例子,其余的和这个类似,不在赘述。

3.1.2 返回引用

函数可以返回引用,用于操作函数外部的数据。

cpp 复制代码
int& modify(int& a) {
    a = 10;
    return a;
}

4. 函数重载(Function Overloading)

函数重载指的是在同一作用域内定义多个同名函数 ,但这些函数的参数列表必须不同 。编译器根据参数的类型和数量决定调用哪个函数。

cpp 复制代码
int add(int a, int b) {
    return a + b;
}

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

int main() {
    cout << add(5, 3) << endl;  // 调用 int 版本
    cout << add(2.5, 3.1) << endl;  // 调用 double 版本
    return 0;
}

5. 内联函数(inline function)

内联函数是一种优化方式,使用 inline 关键字定义内联函数,提示编译器在调用该函数时,将其函数体直接嵌入到调用处。这样可以避免函数调用的开销,但内联函数仅适用于较短的、频繁调用的函数。

cpp 复制代码
inline int square(int x) {
    return x * x;
}

int main() {
    cout << square(5) << endl;  // 输出25
    return 0;
}

6. 递归函数

递归函数是指函数调用自身,通常用于解决具有递归性质的问题,如阶乘、斐波那契数列等。

cpp 复制代码
int factorial(int n) {
    if (n == 0 || n == 1)
        return 1;
    else
        return n * factorial(n - 1);
}

int main() {
    cout << factorial(5) << endl;  // 输出120
    return 0;
}

7. 函数指针

函数指针是一种特殊的指针类型,它指向函数,可以用于动态调用不同的函数。

cpp 复制代码
int add(int a, int b) {
    return a + b;
}

int main() {
    int (*funcPtr)(int, int) = add;  // 定义函数指针并指向add函数
    cout << funcPtr(5, 3) << endl;  // 通过指针调用函数
    return 0;
}

8. 模板函数

模板函数用于定义与类型无关的通用函数,可以处理不同类型的参数,而不需要为每种类型重写函数。

cpp 复制代码
template <typename T>
T add(T a, T b) {
    return a + b;
}

int main() {
    cout << add(5, 3) << endl;  // 输出8 (int)
    cout << add(2.5, 3.1) << endl;  // 输出5.6 (double)
    return 0;
}

9. Lambda表达式

Lambda 表达式是 C++11 引入的一种简写形式,用于定义匿名函数。

cpp 复制代码
auto add = [](int a, int b) { return a + b; };

int main() {
    cout << add(5, 3) << endl;  // 输出8
    return 0;
}

10. 总结

C++ 的函数系统非常灵活且功能强大,它支持函数重载、默认参数、模板、递归、内联函数、Lambda 表达式等丰富的功能,可以帮助开发者更有效地组织和优化代码。

相关推荐
John_ToDebug8 小时前
Chromium安全架构深度解析:从悬空指针检测到内存安全防御体系
c++·chrome
D_evil__8 小时前
【Effective Modern C++】第五章 右值引用、移动语义和完美转发:24. 区分万能引用和右值引用
c++
小小小米粒8 小时前
Maven Tools
java
禹凕8 小时前
Python编程——进阶知识(多线程)
开发语言·爬虫·python
蜡笔小马8 小时前
10.Boost.Geometry R-tree 空间索引详解
开发语言·c++·算法·r-tree
IOsetting8 小时前
金山云主机添加开机路由
运维·服务器·开发语言·网络·php
kali-Myon8 小时前
2025春秋杯网络安全联赛冬季赛-day1
java·sql·安全·web安全·ai·php·web
我是咸鱼不闲呀8 小时前
力扣Hot100系列20(Java)——[动态规划]总结(下)( 单词拆分,最大递增子序列,乘积最大子数组 ,分割等和子集,最长有效括号)
java·leetcode·动态规划
清水白石0088 小时前
深入解析 LRU 缓存:从 `@lru_cache` 到手动实现的完整指南
java·python·spring·缓存
林开落L8 小时前
从零开始学习Protobuf(C++实战版)
开发语言·c++·学习·protobuffer·结构化数据序列化机制