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

相关推荐
哎呦没19 分钟前
SpringBoot框架下的资产管理自动化
java·spring boot·后端
m0_571957582 小时前
Java | Leetcode Java题解之第543题二叉树的直径
java·leetcode·题解
一点媛艺3 小时前
Kotlin函数由易到难
开发语言·python·kotlin
姑苏风3 小时前
《Kotlin实战》-附录
android·开发语言·kotlin
奋斗的小花生4 小时前
c++ 多态性
开发语言·c++
魔道不误砍柴功4 小时前
Java 中如何巧妙应用 Function 让方法复用性更强
java·开发语言·python
NiNg_1_2344 小时前
SpringBoot整合SpringSecurity实现密码加密解密、登录认证退出功能
java·spring boot·后端
闲晨4 小时前
C++ 继承:代码传承的魔法棒,开启奇幻编程之旅
java·c语言·开发语言·c++·经验分享
老猿讲编程5 小时前
一个例子来说明Ada语言的实时性支持
开发语言·ada
UestcXiye6 小时前
《TCP/IP网络编程》学习笔记 | Chapter 3:地址族与数据序列
c++·计算机网络·ip·tcp