07-C++学习笔记-函数

在这里插入图片描述

📚 函数的概念

函数是一段可重复使用的代码块,用于完成特定的任务。通过使用函数,可以将程序划分为多个模块,提高代码的可读性、可维护性和复用性。

在C++中,函数由函数头和函数体组成。函数头包含函数的返回类型、函数名和参数列表,函数体则包含了具体的代码实现。

🧱 函数基础

下面是一个简单的函数示例,用于计算两个整数的和:

#include <iostream>
using namespace std;

// 函数定义
int sum(int a, int b) {
    int result = a + b;
    return result;
}

int main() {
    // 函数调用
    int num1 = 5;
    int num2 = 10;
    int result = sum(num1, num2);

    cout << "两个整数的和是:" << result << endl;

    return 0;
}

在上述示例中,我们定义了一个名为sum的函数,它接收两个整数参数ab,并返回它们的和。在main函数中,我们调用了sum函数,并将其返回值赋给result变量,最后输出结果。

🎯 形参和实参

在函数定义中,函数的参数被称为形式参数(或简称为形参)。在函数调用时,我们提供的具体数值被称为实际参数(或简称为实参)。形参和实参的值可以通过参数传递机制进行传递。

例如,我们有一个函数add,它接收两个参数xy,用于计算它们的和:

#include <iostream>
using namespace std;

// 函数定义
int add(int x, int y) {
    int result = x + y;
    return result;
}

int main() {
    // 函数调用,传递实参
    int a = 5;
    int

 b = 10;
    int sum = add(a, b);

    cout << "两个数的和是:" << sum << endl;

    return 0;
}

在上述示例中,add函数的形参是xy,而在main函数中的函数调用中,abadd函数的实参。

📞 函数的调用

✨直接调用

最常见的函数调用方式是直接调用。直接调用是指直接通过函数名和参数列表来调用函数。

示例:

#include <iostream>
using namespace std;

// 函数定义
void sayHello() {
    cout << "Hello, World!" << endl;
}

int main() {
    // 函数调用
    sayHello();

    return 0;
}

在上述示例中,我们定义了一个名为sayHello的函数,它不接收任何参数,也没有返回值。在main函数中,我们通过直接调用sayHello函数来输出"Hello, World!"。

✨ 嵌套调用

函数之间可以相互调用,即一个函数中调用另一个函数,这种调用方式称为嵌套调用。

示例:

#include <iostream>
using namespace std;

// 函数定义
void printNumber(int num) {
    cout << "数字为:" << num << endl;
}

void printSum(int a, int b) {
    int sum = a + b;
    cout << "两个数字的和为:" << sum << endl;
    printNumber(sum);
}

int main() {
    // 函数调用
    int x = 5;
    int y = 10;
    printSum(x, y);

    return 0;
}

在上述示例中,我们定义了两个函数printNumberprintSumprintNumber函数用于输出一个数字,printSum函数用于计算两个数字的和,并调用printNumber函数来输出和的值。

✨ 递归调用

递归调用是指函数自己调用自己的调用方式。递归函数通常包含一个终止条件,用于结束递归调用。

示例:

#include <iostream>
using namespace std;

// 递归函数定义
void countdown(int n) {
    // 终止条件
    if (n == 0) {
        cout << "Blastoff!" << endl;
    } else {
        cout << n << " ";
        countdown(n - 1); // 递归调用
    }
}

int main() {
    // 函数调用
    countdown(5);

    return 0;
}

在上述示例中,我们定义了一个名为countdown的递归函数,它用于倒数输出数字。当倒数到达0时,函数输出"Blastoff!",否则继续递归调用countdown函数。

🔀 函数的参数传递

函数的参数传递方式决定了在函数调

用中,实参和形参之间是如何进行数据传递的。C++中常用的参数传递方式包括值传递、指针传递和引用传递。

✨ 值传递

值传递是指在函数调用时,将实参的值复制给形参。在函数内部,对形参的修改不会影响到实参的值。

示例:

#include <iostream>
using namespace std;

// 函数定义
void changeValue(int num) {
    num = 10; // 修改形参的值
}

int main() {
    // 函数调用
    int x = 5;
    changeValue(x);

    cout << "x的值为:" << x << endl;

    return 0;
}

在上述示例中,changeValue函数的形参num被赋予了实参x的值。在函数内部,我们尝试修改num的值为10,但这不会影响到实参x的值。

✨ 指针传递

指针传递是指在函数调用时,将实参的地址传递给形参。通过使用指针,可以在函数内部直接修改实参的值。

示例:

#include <iostream>
using namespace std;

// 函数定义
void changeValue(int* ptr) {
    *ptr = 10; // 修改指针所指向的变量的值
}

int main() {
    // 函数调用
    int x = 5;
    changeValue(&x);

    cout << "x的值为:" << x << endl;

    return 0;
}

在上述示例中,changeValue函数的形参ptr是一个指向整数的指针。在函数内部,我们通过解引用ptr来修改所指向的变量的值,从而影响到实参x的值。

✨ 引用传递

引用传递是指在函数调用时,将实参的引用传递给形参。通过使用引用,可以在函数内部直接修改实参的值,并且代码更加简洁易读。

示例:

#include <iostream>
using namespace std;

// 函数定义
void changeValue(int& ref) {
    ref = 10; // 修改引用所引用的变量的值
}

int main() {
    // 函数调用
    int x = 5;
    changeValue(x);

    cout << "x的值为:" << x << endl;

    return 0;
}

在上述示例中,changeValue函数的形参ref是对整数的引用。在函数内部,我们直接通过修改ref所引用的变量的值来影响到实参x的值。

✨ 数组传递

数组传递是指在函数调用时,将数组的地址传递给形参。通过使用数组的地址,可以在函数内部访问和修改数组元素的值。

示例:

#include <iostream>
using namespace

 std;

// 函数定义
void printArray(int arr[], int size) {
    for (int i = 0; i < size; i++) {
        cout << arr[i] << " ";
    }
    cout << endl;
}

int main() {
    // 函数调用
    int myArray[] = {1, 2, 3, 4, 5};
    int size = sizeof(myArray) / sizeof(myArray[0]);
    printArray(myArray, size);

    return 0;
}

在上述示例中,printArray函数接收一个整数数组arr和数组的大小size作为参数。在函数内部,我们通过遍历数组来输出数组的元素。

✨ 为参数默认值

在C++中,可以为函数的参数设置默认值。如果在函数调用时没有提供对应的实参,将使用默认值作为实参。

示例:

#include <iostream>
using namespace std;

// 函数定义,设置默认值
void printNumber(int num = 0) {
    cout << "数字为:" << num << endl;
}

int main() {
    // 函数调用
    printNumber(); // 使用默认值
    printNumber(10); // 提供实参

    return 0;
}

在上述示例中,printNumber函数的形参num设置了默认值为0。在函数调用时,如果没有提供实参,将使用默认值;如果提供了实参,则使用实参的值。

♻️ 函数的重载

函数重载是指在同一个作用域内,可以定义多个同名函数,但它们的参数列表必须不同。函数重载通过参数的类型、个数或顺序的不同来实现。

示例:

#include <iostream>
using namespace std;

// 函数重载
int add(int a, int b) {
    return a + b;
}

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

int main() {
    // 函数调用
    int sum1 = add(5, 10);
    double sum2 = add(2.5, 3.7);

    cout << "整数相加的结果为:" << sum1 << endl;
    cout << "浮点数相加的结果为:" << sum2 << endl;

    return 0;
}

在上述示例中,我们定义了两个名为add的函数,它们的参数列表分别是两个整数和两个浮点数。通过函数重载,我们可以根据传入的参数类型选择相应的函数进行调用。

📝 函数模板

函数模板是一种通用的函数定义,可以在不同的数据类型上进行操作。通过使用函数模板,可以编写出适用于多种类型的函数。

示例:

#include <iostream>
using namespace std;

// 函数模板定义
template <typename T>
T max(T a, T b) {
    return (a > b) ? a : b;
}

int main() {
    // 函数调用
    int num1 = 5, num2 = 10;
    double x = 3.5,

 y = 4.7;

    int maxInt = max(num1, num2);
    double maxDouble = max(x, y);

    cout << "整数的最大值为:" << maxInt << endl;
    cout << "浮点数的最大值为:" << maxDouble << endl;

    return 0;
}

在上述示例中,我们定义了一个名为max的函数模板。通过typename T声明了一个模板参数,用于表示待确定的数据类型。在函数体内部,我们比较两个参数的大小,并返回较大的值。

main函数中,我们分别调用了max函数模板,并传入了不同类型的实参。编译器根据实参的类型自动推导出相应的函数类型,并进行函数调用。

🔄 内联函数和constexpr函数

✨ 内联函数

内联函数是指在函数调用时,将函数的代码直接插入到调用的地方,而不是通过函数调用的方式执行。内联函数的目的是减少函数调用的开销,提高代码的执行效率。

示例:

#include <iostream>
using namespace std;

// 内联函数定义
inline int add(int a, int b) {
    return a + b;
}

int main() {
    // 函数调用
    int sum = add(5, 10);

    cout << "两个数的和是:" << sum << endl;

    return 0;
}

在上述示例中,我们使用inline关键字将add函数声明为内联函数。在函数调用时,编译器将函数的代码直接插入到调用的地方,避免了函数调用的开销。

✨ constexpr函数

constexpr函数是指在编译时求值的函数。它可以在编译阶段计算出结果,并在运行时作为常量使用。

示例:

#include <iostream>
using namespace std;

// constexpr函数定义
constexpr int fibonacci(int n) {
    return (n <= 1) ? n : fibonacci(n - 1) + fibonacci(n - 2);
}

int main() {
    // 函数调用
    constexpr int fib = fibonacci(5);

    cout << "斐波那契数列的第五项是:" << fib << endl;

    return 0;
}

在上述示例中,我们定义了一个名为fibonacciconstexpr函数,用于计算斐波那契数列的第n项。在main函数中,我们使用fibonacci(5)来初始化一个constexpr变量fib,并在输出中使用。

由于constexpr函数在编译时求值,因此它的参数必须是编译时可确定的常量。在C++11之前,constexpr函数的函数体必须是单一的return语句;从C++14开始,constexpr函数可以包含更复杂的逻辑。

📚结语

本篇学习笔记介绍了C++中的

函数概念及相关知识点。我们学习了函数的基础知识,包括函数的定义、调用和参数传递方式。我们还学习了函数重载、函数模板以及内联函数和constexpr函数的使用。

通过学习函数的相关知识,我们可以更好地组织和管理程序的代码,提高代码的复用性和可维护性。在实际的程序开发中,函数是一种重要的代码组织方式,合理地使用函数可以使程序结构更加清晰,代码更加简洁高效。

希望本篇学习笔记对你理解和掌握C++中的函数概念有所帮助!如有疑问,请随时提问。

⭐️希望本篇文章对你有所帮助。

⭐️如果你有任何问题或疑惑,请随时向提问。

⭐️感谢阅读!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

逸峰轻云

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值