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 表达式等丰富的功能,可以帮助开发者更有效地组织和优化代码。

相关推荐
天上掉下来个程小白12 分钟前
开发环境搭建-06.后端环境搭建-前后端联调-Nginx反向代理和负载均衡概念
java·运维·spring boot·后端·nginx·负载均衡·苍穹外卖
Maple_land13 分钟前
C++入门——命名空间
c++
试着生存15 分钟前
java根据List<Object>中的某个属性排序(数据极少,顺序固定)
java·python·list
酷爱码15 分钟前
2025DNS二级域名分发PHP网站源码
开发语言·php
_星辰大海乀16 分钟前
LinkedList 双向链表
java·数据结构·链表·list·idea
MSTcheng.18 分钟前
【C语言】动态内存管理
c语言·开发语言·算法
热心市民小汪20 分钟前
管理conda下python虚拟环境
开发语言·python·conda
小韩学长yyds27 分钟前
Java调用第三方HTTP接口:从入门到实战
java·开发语言·http
McQueen_LT29 分钟前
聊天室Python脚本——ChatGPT,好用
开发语言·python·chatgpt
苏十八29 分钟前
JavaEE Servlet02
java·服务器·网络·java-ee·json