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

这篇具有很好参考价值的文章主要介绍了07-C++学习笔记-函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

07-C++学习笔记-函数,C++基础笔记,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++中的函数概念有所帮助!如有疑问,请随时提问。

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

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

⭐️感谢阅读!文章来源地址https://www.toymoban.com/news/detail-516797.html

到了这里,关于07-C++学习笔记-函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 网工实操基础学习23.07.05

    交换机的作用是链接同一个网络下的所有设备,如果有无线设备加入,需要添加AP(无线接入点)设备在交换机层次上  路由器的作用是将不同网络下的设备链接 划分网段:网络位、网段、子网掩码 看子网掩码有多少个255,可以确定网络位有几段,确定自己的网段就可以比较

    2024年02月09日
    浏览(34)
  • 深度学习笔记(四)——使用TF2构建基础网络的常用函数+简单ML分类实现

    文中程序以Tensorflow-2.6.0为例 部分概念包含笔者个人理解,如有遗漏或错误,欢迎评论或私信指正。 截图和程序部分引用自北京大学机器学习公开课 1、张量处理类 强制数据类型转换: 查找数据中的最小值和最大值: 上一行例子中是对整个张量查找,也按照一定的方向查找

    2024年01月16日
    浏览(44)
  • C语言学习笔记 第一个C语言项目-07

    目录 1.新建一个文件夹  2.新建一个文件,后缀以.cpp结尾 3.编写代码 4.编译与执行代码 代码解析  总结  如下图所示,选择相应的文件夹,然后点击新建文件按钮,新建的文件一定要写后缀。 #includestdio.h int main(){     printf(\\\"hello world!n\\\");     return 0; } 在vscode中,首先保存文

    2024年02月16日
    浏览(45)
  • web安全学习笔记【07】——非http\https抓包

    #知识点: 1、Web常规-系统中间件数据库源码等 2、Web其他-前后端软件Docker分配站等 3、Web拓展-CDNWAFOSS反向负载均衡等 ----------------------------------- 1、APP架构-封装原生态H5flutter等 2、小程序架构-WebH5JSVUE框架等 ----------------------------------- 1、渗透命令-常规命令文件上传下载 2、反

    2024年02月19日
    浏览(53)
  • 【JavaEE基础学习打卡07】JDBC之应用分层设计浅尝!

    📜 本系列教程适用于JavaWeb初学者、爱好者,小白白。我们的天赋并不高,可贵在努力,坚持不放弃。坚信量最终引发质变,厚积薄发。 🚀 文中白话居多,尽量以小白视角呈现,帮助大家快速入门。 🎅 我是 蜗牛老师 ,之前网名是 Ongoing蜗牛 ,人如其名,干啥都慢,所以

    2024年02月09日
    浏览(38)
  • 【动手学深度学习】课程笔记 05-07 线性代数、矩阵计算和自动求导

    向量相关 矩阵相关 简单来说,范数是用来衡量矩阵(张量)大小的值,范数的值有不同的规定。 仅记录一些我比较陌生的知识。 张量的克隆 张量的降维 首先定义一个张量x,指定其元素的数据类型为32位的float: 接着调用求和函数,因为会对张量中的一些维度进行求和,求

    2024年02月03日
    浏览(47)
  • 人工智能基础_机器学习006_有监督机器学习_正规方程的公式推导_最小二乘法_凸函数的判定---人工智能工作笔记0046

    我们来看一下公式的推导这部分比较难一些, 首先要记住公式,这个公式,不用自己理解,知道怎么用就行, 比如这个(mA)T 这个转置的关系要知道 然后我们看这个符号就是求X的导数,X导数的转置除以X的导数,就得到单位矩阵, 可以看到下面也是,各种X的导数,然后计算,得到对应的矩阵

    2024年02月08日
    浏览(58)
  • 人工智能基础_机器学习007_高斯分布_概率计算_最小二乘法推导_得出损失函数---人工智能工作笔记0047

    这个不分也是挺难的,但是之前有详细的,解释了,之前的文章中有, 那么这里会简单提一下,然后,继续向下学习 首先我们要知道高斯分布,也就是,正太分布, 这个可以预测x在多少的时候,概率最大 要知道在概率分布这个,高斯分布公式中,u代表平均值,然后西格玛代表标准差,知道了

    2024年02月07日
    浏览(74)
  • k8s学习笔记-07(借助kubectl explain编写yaml文件)

    原创文档编写不易,未经许可请勿转载。文档中有疑问的可以邮件联系我。 邮箱:yinwanit@163.com 文章记录了本人学习yaml文件编写过程中的一些经验分享。 在k8s学习过程中yaml文件的编写无疑是比较让人头痛的,尤其是最开始学习的时候。作者结合自己学习过程总结了以下几点

    2024年02月04日
    浏览(45)
  • 读SQL学习指南(第3版)笔记07_分组和子查询

    2.1.1.1. 查询返回的每个值都是由聚合函数生成的 2.1.1.2. 没有使用group by子句 2.1.1.3. 只有一个隐式分组 2.1.1.3.1. payment数据表中的所有行 2.2.1.1. 添加一个group by子句来指定聚合函数应该应用于哪个分组 2.6.2.1. 因为在评估where子句时,分组尚未生成,因而必须将分组过滤条件

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包