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

news2024/11/24 5:03:24

在这里插入图片描述

📚 函数的概念

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

在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++中的函数概念有所帮助!如有疑问,请随时提问。

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

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

⭐️感谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/709751.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

日期格式化不起作用 2022-09-18T05:25:30.000+00:00

java->web JsonFormat(pattern “yyyy-MM-dd HH:mm:ss”)一般版本问题或依赖冲突不起作用 解决&#xff1a; spring:jackson:serialization:write-dates-as-timestamps: falsedate-format: yyyy-MM-dd HH:mm:ss这个配置会在java对象传输给web前端的时候对日期的字段进行…

Linux 查看端口占用命令

文章目录 1、lsof -i:端口号2、netstat 命令2.1 netstat -tunlp 命令2.2 netstat -anp 命令 1、lsof -i:端口号 用于查看某一端口的占用情况&#xff0c;比如查看5000端口使用情况&#xff1a; lsof -i:5000常用命令&#xff1a; lsof -i:5000&#xff1a;查看5000端口占用 …

QT或VS2015报错:Error: C2661: QColor::ct::ct: 没有重载函数接受 5 个参数解决方案

安装了QT5.14.2 MSCV2015配置并同时在QT或VS2015测试并运行都提示没有重载函数接受 5 个参数。 同时还会出现C2134错误&#xff1a;QMetaObject::SuperData::operator const QMetaObject *: 调用不会生成常数表达式的错误 搜索了网络上的结果都让换其它版本&#xff0c;没有…

高压线路零序电流方向保护程序逻辑原理(一)

一、微机型零序电流方向保护概念 &#xff08;一&#xff09;保护电流元件的配置 零序电流方向保护是反应大接地电流系统的线路发生接地故障时&#xff0c;零序电流分量大小和方向的多段式电流方向保护。在我国大接地电流系统线路上都装设了这种接地保护装置&#xff0c;这种保…

(推荐)Abaqus中C++子程序开发入门

ABAQUS是支持C子程序开发的&#xff0c;相比于传统的Fortran&#xff0c;C作为高级语言的优势不言而喻&#xff0c;再搭配优秀的C程序库&#xff0c;使得我们的编程效率大大提高&#xff0c;尤其是对于熟悉C编程的开发者&#xff0c;不失为一种更好的选择。 1 软件配置 1.1 环…

20230702 正态分布的几个性质

正态分布以及高斯函数的定义 如果随机变量 X X X 的密度函数为 f μ , σ ( x ) 1 σ 2 π e − ( x − μ ) 2 2 σ 2 , x ∈ R , σ > 0 f_{\mu, \sigma}(x)\frac{1}{\sigma \sqrt{2 \pi}} e^{-\dfrac{(x-\mu)^2}{2 \sigma^2}}, \quad x \in \mathbb{R}, \sigma>0 …

the size of an array must be greater than zero

keil默认不支持数组定义的情况buf[0]

Pytorch深度强化学习1-2:详解K摇臂赌博机模型和ϵ-贪心算法

目录 0 专栏介绍1 K-摇臂赌博机2 ϵ \epsilon ϵ-贪心算法3 softmax算法4 Python实现与分析 0 专栏介绍 本专栏重点介绍强化学习技术的数学原理&#xff0c;并且采用Pytorch框架对常见的强化学习算法、案例进行实现&#xff0c;帮助读者理解并快速上手开发。同时&#xff0c;…

Java设计模式之行为型-观察者模式(UML类图+案例分析)

目录 一、基本概念 二、UML类图 三、角色设计 四、代码实现 案例一 案例二 案例三 五、总结 一、基本概念 观察者先订阅被观察者对象&#xff0c;当被观察者的状态发生变化时&#xff0c;观察者可以及时收到消息&#xff0c;在这种模式当中&#xff0c;被观察者维护了…

回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测

回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测 目录 回归预测 | MATLAB实现SSA-DBN麻雀算法优化深度置信网络的数据多输入单输出回归预测效果一览基本介绍模型描述程序设计参考资料 效果一览 基本介绍 基于麻雀算法优化深度置信网络(SSA-DB…

【Java】顺序表ArrayList

文章目录 一、顺序表二、ArrayList 的简介三、ArrayList 的使用3.1 构造方法3.2 常见操作3.3 遍历方法3.4 扩容机制 四、ArrayList 的模拟实现五、ArrayList 的使用案例5.1 扑克牌案例5.2 杨辉三角案例 六、ArrayList 存在的问题 一、顺序表 顺序表&#xff08;Sequential Lis…

JS中的字典和散列表

前言 除了集合&#xff0c;我们还可以用字典和散列表来存储唯一值。 集合学习请见&#xff1a; 自定义集合和ES6集合http://t.csdn.cn/RcznA 在集合中&#xff0c;我们关注的是每个值本身。并将它作为主要元素。 而字典和散列表都是以[键:值]的形式来存储数据。 不同的…

Linux中vim的预备代码(prepare-code)设置

1、进入以下目录&#xff1a; /home/yys/.vim/plugged/prepare-code/snippet注意&#xff1a;yys是我个人的账号名称&#xff0c;每个人的都不一样&#xff01; 2、修改相应的预备代码&#xff0c;比如snippet.c 修改完之后保存&#xff0c;之后再创建c文件则会自动初始化有…

Python如何免费获取付费文档的数据, 保存word文档

目录标题 前言开发环境:模块使用:代码实现步骤:代码展示尾语 前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 开发环境: python 3.8 pycharm 模块使用: requests --> pip install requests re json time base64 docx --> pip install python-docx 第三方模…

【C++初阶】string类常见题目详解(二) —— 把字符串转换成整数、反转字符串、反转字符串 II、反转字符串中的单词 III、字符串相乘

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;C初阶 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;C初阶】s…

ElasticSearch学习02——Kibana安装

ElasticSearch学习02——Windows下Kibana安装 Kibana是界面化的查询数据的工具&#xff0c;下载时尽量下载与ElasicSearch一致的版本。 1、下载对应版本的Kibana ​ 有了ElasticSearch安装的经验&#xff0c;我们发现了ES和JDK有着版本对应的关系&#xff0c;Kibana和ES共同为…

【Linux基础命令】nmtui命令使用实战

前言 linux常用命令专栏已进入尾声&#xff0c;大约90个命令是日常工作中常用的&#xff0c;在拓展一些不常用的&#xff0c;也就100左右。 是不是总结下来后&#xff0c;就感觉要学的内容没有那么多了。 当然有些专属的基础命令不在本专栏内&#xff0c;比如LVM管理命令&am…

微信读书:从Paxos到Zookeeper:分布式一致性原理与实践(阅读摘录)

微信读书&#xff1a;从Paxos到Zookeeper&#xff1a;分布式一致性原理与实践&#xff08;阅读摘录&#xff09; 阅读地址 CAP理论 CAP理论告诉我们&#xff0c;一个分布式系统不可能同时满足一致性(C&#xff1a;Consistency)、可用性(A&#xff1a;Availability)和分区容错…

Andriod 开发 SearchView默认弹出软键盘

SearchView默认弹出软键盘&#xff0c;遮挡了主界面 这很明显是SearchView是默认自动获取了焦点&#xff0c;所以上网搜了一下如何清除焦点&#xff1a; SearchView searchView getActivity().findViewById(R.id.searchViewSearchbar); searchView.clearFocus(); 然而没用&…

零拷贝原理

在实际应用中&#xff0c;如果我们需要把磁盘中的某个文件内容发送到远程服务器上&#xff0c;那么它必 须要经过几个拷贝的过程。从磁盘中读取目标文件内容拷贝到内核缓冲区&#xff0c;CPU 控制器再把内核缓冲区的数据赋值到用户空间的缓冲区中&#xff0c; 接着在应用程序中…