C++重新入门-C++ 函数

函数是一组一起执行一个任务的语句。每个 C++ 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。

您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上,划分通常是根据每个函数执行一个特定的任务来进行的。

函数声明告诉编译器函数的名称、返回类型和参数。函数定义提供了函数的实际主体。

C++ 标准库提供了大量的程序可以调用的内置函数。例如,函数 strcat() 用来连接两个字符串,函数 memcpy() 用来复制内存到另一个位置。

函数还有很多叫法,比如方法、子例程或程序,等等。

1.函数定义

函数头

函数头包括函数的返回类型、函数名、参数列表等信息。

return_type function_name(parameter_list) {
    // 函数体
}
  • return_type 是函数返回的数据类型,它指定了函数执行后的返回值类型。如果函数不返回任何值,可以使用 void
  • function_name 是函数的名称,它用于在程序中唯一标识函数。
  • parameter_list 是函数的参数列表,包括参数的数据类型和名称。如果函数不接受任何参数,则参数列表为空。

函数体

函数体包含了函数的实际操作内容。

return_type function_name(parameter_list) {
    // 函数体,包括对参数的处理、各种语句的执行等
    // 通常包括一个 return 语句来返回结果
    return result;
}
  • 函数体是函数的实际执行代码,包括对参数的处理、各种语句的执行等。
  • 在函数体中,通常包含一个 return 语句,用于返回函数的结果。如果函数返回类型为 void,则可以省略 return 语句,或者使用 return; 来提前结束函数执行。

示例

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

#include <iostream>

// 函数定义
int add(int a, int b) {
    int sum = a + b; // 计算两个整数的和
    return sum;      // 返回计算结果
}

// 主函数
int main() {
    int x = 5;
    int y = 3;
    int result = add(x, y); // 调用函数 add,并将返回值赋给 result
    std::cout << "The sum of " << x << " and " << y << " is " << result << std::endl;
    return 0;
}

在这个示例中,add 函数接受两个整数参数 ab,计算它们的和,并将结果返回。在 main 函数中,我们调用 add 函数,并将返回的结果输出到控制台。

总之,函数定义是 C++ 程序中的重要组成部分,用于封装和组织代码,提高代码的复用性和可维护性。

2.函数声明

C++ 函数声明指的是在程序中提前声明函数的名称、参数列表和返回类型,但不包括函数体。函数声明的目的是为了让编译器知道在后面的代码中会用到这个函数,以便在编译时能够进行类型检查和语法分析。

函数声明包括函数名称、参数列表和返回类型。一般情况下,函数声明的形式如下:

return_type function_name(parameter_list);
  • return_type: 指定函数返回值的类型,可以是任何有效的 C++ 数据类型,包括基本数据类型、自定义数据类型(类、结构体等),或者 void 表示函数没有返回值。
  • function_name: 函数的名称,用于在其他地方调用该函数。
  • parameter_list: 函数的参数列表,包括参数的类型和名称。如果函数不需要参数,则可以省略参数列表,或者使用 void 关键字表示没有参数。

 下面是一个简单的函数声明示例:

int add(int a, int b); // 声明一个名为 add 的函数,该函数接受两个 int 类型的参数,并返回一个 int 类型的值
void greet();           // 声明一个名为 greet 的函数,该函数不接受任何参数,也没有返回值

在函数声明中,不需要提供函数的实现(函数体),只需要提供函数的签名(名称、参数列表和返回类型)。函数的实现可以在稍后的代码中定义。通常,函数的实现应该与其声明匹配,否则会导致编译错误。

函数声明通常可以放在头文件中,以便在多个源文件中共享函数接口。在源文件中,可以包含这些头文件,以便编译器能够识别函数声明并进行相应的类型检查。

函数声明的目的是为了提供函数接口,使得代码模块化,并能够在不同的地方使用相同的函数,从而提高代码的可维护性和可重用性。

3.调用函数

创建 C++ 函数时,会定义函数做什么,然后通过调用函数来完成已定义的任务。

当程序调用函数时,程序控制权会转移给被调用的函数。被调用的函数执行已定义的任务,当函数的返回语句被执行时,或到达函数的结束括号时,会把程序控制权交还给主程序。

调用函数时,传递所需参数,如果函数返回一个值,则可以存储返回值。例如:

#include <iostream>
using namespace std;
 
// 函数声明
int max(int num1, int num2);
 
int main ()
{
   // 局部变量声明
   int a = 100;
   int b = 200;
   int ret;
 
   // 调用函数来获取最大值
   ret = max(a, b);
 
   cout << "Max value is : " << ret << endl;
 
   return 0;
}
 
// 函数返回两个数中较大的那个数
int max(int num1, int num2) 
{
   // 局部变量声明
   int result;
 
   if (num1 > num2)
      result = num1;
   else
      result = num2;
 
   return result; 
}

把 max() 函数和 main() 函数放一块,编译源代码。当运行最后的可执行文件时,会产生下列结果:

Max value is : 200

4.函数参数

如果函数要使用参数,则必须声明接受参数值的变量。这些变量称为函数的形式参数

形式参数就像函数内的其他局部变量,在进入函数时被创建,退出函数时被销毁。

当调用函数时,有三种向函数传递参数的方式:

 默认情况下,C++ 使用传值调用来传递参数。一般来说,这意味着函数内的代码不能改变用于调用函数的参数。之前提到的实例,调用 max() 函数时,使用了相同的方法。

5.参数的默认值

在 C++ 中,可以为函数的参数提供默认值。这意味着在函数调用时,如果没有提供对应参数的值,那么将会使用默认值。这样做可以使函数调用更加灵活,可以减少代码中函数调用时需要提供的参数数量,同时也可以为函数的参数提供一个合理的默认值。

为函数参数提供默认值的语法是在函数声明或定义中,在参数列表中为希望设置默认值的参数赋值。这些参数必须是参数列表中的最右侧参数,也就是说,不能为中间或左侧的参数提供默认值。

以下是一个简单的示例,演示了如何在 C++ 中为函数参数提供默认值:

 

#include <iostream>

// 函数声明,参数 x 和 y 有默认值
int add(int x, int y = 0);

int main() {
    int a = 5, b = 3;
    int sum1 = add(a, b); // 调用 add 函数并传递两个参数
    int sum2 = add(a);    // 调用 add 函数并只传递一个参数
    std::cout << "Sum 1: " << sum1 << std::endl;
    std::cout << "Sum 2: " << sum2 << std::endl;
    return 0;
}

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

在这个示例中,add 函数的第二个参数 y 被赋予了默认值 0。这意味着在调用 add 函数时,如果没有提供第二个参数,将会使用默认值 0。在 main 函数中,有两个 add 函数的调用,其中一个传递了两个参数,而另一个只传递了一个参数。由于第二个参数有默认值,所以即使第二次调用中只传递了一个参数,函数也能够正常工作。

需要注意的是,一旦为参数提供了默认值,那么在调用函数时,可以省略相应位置的参数,但是在函数声明和定义中,必须为所有没有默认值的参数提供类型声明。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python+flask+django医院预约挂号系统6nrhh

医院预约挂号系统主要有管理员、用户和医生三个功能模块。以下将对这三个功能的作用进行详细的剖析。 技术栈 后端&#xff1a;python 前端&#xff1a;vue.jselementui 框架&#xff1a;django/flask Python版本&#xff1a;python3.7 数据库&#xff1a;mysql5.7 数据库工具…

基于无线传感器网络的LC-DANSE波束形成算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1LC-DANSE算法原理 4.2 LCMV算法原理 5.完整程序 1.程序功能描述 在无线传感器网络中&#xff0c;通过MATLAB对比LC-DANSE波束形成算法和LCMV波束形成算法。对比SNR&#xff0c;mse等指标…

QT学习文件操作类 QFile

&#xff08;一&#xff09;QFile QFile 是 Qt 框架中用于文件处理的一个类。它提供了读取和写入文件的功能&#xff0c;支持文本和二进制文件。QFile 继承自 QIODevice &#xff0c;因此它可以像其他 IO 设备一样使用。 &#xff08;1&#xff09;主要功能 1. 文件读写…

深度优先搜索(DFS)与广度优先搜索(BFS):探索图与树的算法

一、引言 在图论和树形结构中&#xff0c;搜索算法是寻找从起点到终点的路径的关键。其中&#xff0c;深度优先搜索&#xff08;DFS&#xff09;和广度优先搜索&#xff08;BFS&#xff09;是最常用且最基础的两种搜索算法。本文将详细介绍广度优先搜索&#xff08;BFS&#xf…

CVE-2022-25487 漏洞复现

漏洞描述&#xff1a;Atom CMS 2.0版本存在远程代码执行漏洞&#xff0c;该漏洞源于/admin/uploads.php 未能正确过滤构造代码段的特殊元素。攻击者可利用该漏洞导致任意代码执行。 其实这就是一个文件上传漏洞罢了。。。。 打开之后&#xff0c;/home路由是个空白 信息搜集&…

分享88个鼠标特效,总有一款适合您

分享88个鼠标特效&#xff0c;总有一款适合您 88个鼠标特效下载链接&#xff1a;https://pan.baidu.com/s/1ljcxwgXGpw7baiufUGJjZA?pwd8888 提取码&#xff1a;8888 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不…

C++之继承

一&#xff0c;概念及用法 1&#xff09;概念 首先我们来了解一下官方的概念&#xff1a;继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段&#xff0c;它允许程序员在保持原有类特性的基础上进行扩展&#xff0c;增加功能&#xff0c;这样产生新的类&a…

【Linux学习】线程详解

目录 十八.多线程 18.1 线程与进程 18.2 内核视角看待创建线程与进程 18.3 线程优缺点总结 线程的优点&#xff1a; 线程的缺点&#xff1a; 线程的用途&#xff1a; 18.4 线程与进程的联系 十九.线程控制 19.1 POSIX线程库 19.2 线程创建 19.3 线程等待 19.4 线程终止 19.5 线…

C# OCR识别图片中的文字

1、从NuGet里面安装Spire.OCR 2、安装之后&#xff0c;找到安装路径下&#xff0c;默认生成的packages文件夹&#xff0c;复制该文件夹路径下的 6 个dll文件到程序的根目录 3、调用读取方法 OcrScanner scanner new OcrScanner(); string path "C:\1.png"; scann…

原来你也可以DDOS?

首先祝大家新年快乐 这次内容就主要是纸上谈兵&#xff08;因为无法未经试验无法保证成功&#xff09;&#xff0c;而且有关这方面的科普视频也已经有很多了。 原文地址&#xff1a;原来你也可以DDOS&#xff1f; - Pleasure的博客 下面是正文内容&#xff1a; 前言 DDOS是一…

Hive SQL编译成MapReduce任务的过程

一、 Hive 底层执行架构 1.1 Hive底层架构 1 &#xff09;用户接口&#xff1a; Client CLI &#xff08; command-line interface &#xff09;、 JDBC/ODBC(jdbc 访问 hive) 、 WEBUI &#xff08;浏览器访问 hive &#xff09; 2 &#xff09;元数据&#xff1a; Metas…

mxxWechatBot流程与原理

大家伙&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 免责声明&#xff1a;该工具仅供学习使用&#xff0c;禁止使用该工具从事违法活动&#xff0c;否则永久拉黑封禁账号&#xff01;&#xff01;&#xff01;本人不对任何工具的使用负责&am…

高级自定义标记功能

高级自定义标记功能 自定义标记时用户定义的标记,它可通过创建可重用的组件来尽量较少JSP中复杂、重复的业务逻辑代码。这些组件可用于其他应用程序。Javax.servlet.jsp.tagtext包定义了开发自定义标记的类和接口。您可以使用此包的类和接口创建标记处理程序,这些程序可实现带…

matlab发送串口数据,并进行串口数据头的添加,我们来看下pwm解析后并通过串口输出的效果

uintt16位的话会在上面前面加上00&#xff0c;16位的话一定是两个字节&#xff0c;一共16位的数据 如果是unint8的话就不会&#xff0c; 注意这里给的是13&#xff0c;但是现实的00 0D&#xff0c;这是大小端的问题&#xff0c;在matlanb里设置&#xff0c;我们就默认用这个模式…

面了滴滴的数据分析师(实习),几道面试题都是原题啊。。。

年前&#xff0c;技术群组织了一场数据类的技术&面试讨论会&#xff0c;邀请了一些同学分享他们的面试经历&#xff0c;讨论会会定期召开&#xff0c;如果你想加入我们的讨论群或者希望要更详细的资料&#xff0c;文末加入。 喜欢本文记得收藏、关注、点赞 。技术交流文末…

Unity类银河恶魔城学习记录7-2 P68 Setting up details of sword源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Sword_Skill.cs using System.Collections; using System.Collections.Gen…

【数据结构】14 队列(带头结点的链式存储和顺序存储实现)

定义 队列是一个有序线性表&#xff0c;但是队列的插入、删除操作是分别在线性表的两个不同端点进行的。 设一个队列 Q ( a 1 , a 2 , . . . , a n ) Q (a_1, a_2,...,a_n) Q(a1​,a2​,...,an​)&#xff0c;那么 a 1 a_1 a1​被称为队头元素&#xff0c; a n a_n an​为队…

【实战】一、Jest 前端自动化测试框架基础入门 —— 前端要学的测试课 从Jest入门到TDD BDD双实战(一)

文章目录 一、前端要学的测试课1.前端要学的测试2.前端工程化的一部分3.前端自动化测试的例子4.前端为什么需要自动化测试&#xff1f;5.课程涵盖内容6.前置技能7.学习收获 二、Jest 前端自动化测试框架基础入门1. 自动化测试背景及原理前端自动化测试产生的背景及原理 2.前端自…

Javaweb之SpringBootWeb案例之事务进阶的详细解析

1.3 事务进阶 前面我们通过spring事务管理注解Transactional已经控制了业务层方法的事务。接下来我们要来详细的介绍一下Transactional事务管理注解的使用细节。我们这里主要介绍Transactional注解当中的两个常见的属性&#xff1a; 异常回滚的属性&#xff1a;rollbackFor 事…

springboot179基于javaweb的流浪宠物管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…