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,并将返回值赋给 resultstd::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;elseresult = 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 函数的调用,其中一个传递了两个参数,而另一个只传递了一个参数。由于第二个参数有默认值,所以即使第二次调用中只传递了一个参数,函数也能够正常工作。

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

 

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

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

相关文章

鸿蒙开发理论之页面和自定义组件生命周期

1、自定义组件和页面的关系 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c;即页面的根节点&#xff0c;一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…

基于轻量级模型YOLOX-Nano的菜品识别系统

工程Gitee地址&#xff1a; https://gitee.com/zhong-liangtang/ncnn-android-yolox-nano 一、YOLOX简介 YOLOX是一个在2021年被旷视科技公司提出的高性能且无锚框&#xff08;Anchor-free&#xff09;的检测器&#xff0c;在YOLO系列的基础上吸收近年来目标检测学术界的最新…

零基础学python之高级编程(3)---面向对象多态与封装(含有代码示例)

面向对象多态与封装 文章目录 面向对象多态与封装前言一、多态方法重写&#xff08;Overriding&#xff09;方法重载(Overloading)抽象基类和接口&#xff08;Abstract Base Classes and Interfaces&#xff09; 二、封装私有变量和私有方法属性装饰器(property) 和 getter和se…

AI绘画作品的展示和变现

AI绘画作品的展示和推广技巧 如何通过AI绘画打造独特的个人IP 4.1 AI绘画作品买卖 平台一&#xff1a;抖音 抖音平台有「抖音图文扶持计划」&#xff0c;还会不定期推出图文伙伴计划、图文热点来了等&#xff0c;大家起号的时候更容易 当你的每篇作品阅读量稳定在 1W 时&…

大话设计模式——1.模板方法模式(Template Method Pattern)

定义&#xff1a;定义一个操作中的算法的骨架&#xff0c;而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤 例子&#xff1a;比较重大的考试往往有A、B两套试卷&#xff0c;其中一套出现问题可以立马更换另一套。 定义基…

2.12.。

1、选择芯片型号——STM32F051K8 2、开启调试功能 3、配置时钟 4、配置时钟树 5、工程管理

three.js 细一万倍教程 从入门到精通(一)

目录 一、three.js开发环境搭建 1.1、使用parcel搭建开发环境 1.2、使用three.js渲染第一个场景和物体 1.3、轨道控制器查看物体 二、three.js辅助设置 2.1、添加坐标轴辅助器 2.2、设置物体移动 2.3、物体的缩放与旋转 缩放 旋转 2.4、应用requestAnimationFrame …

c#cad 创建-文本(一)

运行环境 vs2022 c# cad2016 调试成功 一、代码说明 该代码是一个用于在AutoCAD中创建文本的命令。 首先&#xff0c;通过添加using语句引用了需要使用的Autodesk.AutoCAD命名空间。 然后&#xff0c;在命名空间CreateTextInCad下定义了一个名为CreateTextCommand的类&…

海里定理例题

1. lim ⁡ x − > 0 s i n ( 1 x ) \lim\limits_{x ->0}sin(\frac{1}{x}) x−>0lim​sin(x1​)的极限不存在 取数列f(x), x n 1 2 n Π − Π 2 x_n\frac{1}{2nΠ-\frac{Π}{2}} xn​2nΠ−2Π​1​和 y n 1 2 n Π Π 2 y_n\frac{1}{2nΠ\frac{Π}{2}} yn​2nΠ2…

Hive SQL编译成MapReduce任务的过程

一、 Hive 底层执行架构 1&#xff09; Hive简介 Hive是Facebook实现的一个开源的数据仓库工具。将结构化的数据文件映射为数据库表&#xff0c;并提供HQL查询功能&#xff0c;将HQL语句转化为MapReduce任务运行 2&#xff09; Hive本质&#xff1a;将 HQL 转化成 MapReduce 程…

Linux:搭建docker私有仓库(registry)

当我们内部需要存储镜像时候&#xff0c;官方提供了registry搭建好直接用&#xff0c;废话少说直接操作 1.下载安装docker 在 Linux 上安装 Docker Desktop |Docker 文档https://docs.docker.com/desktop/install/linux-install/安装 Docker 引擎 |Docker 文档https://docs.do…

手把手教你开发Python桌面应用-PyQt6图书管理系统-图书信息删除实现

锋哥原创的PyQt6图书管理系统视频教程&#xff1a; PyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~_哔哩哔哩_bilibiliPyQt6图书管理系统视频教程 Python桌面开发 Python入门级项目实战 (无废话版) 火爆连载更新中~共计24条视频&…

【51单片机】串口通信实验(包括波特率如何计算)

目录 串口通信实验通信的基本概念串行通信与并行通信异步通信与同步通信单工、 半双工与全双工通信通信速率 51单片机串口介绍串口介绍串口通信简介串口相关寄存器串口工作方式方式0方式1方式 2 和方式 3 串口的使用方法&#xff08;计算波特率&#xff09; 硬件设计软件设计1、…

类与结构体(6)

我们上一起讲了这一期讲存储类和继承&#xff0c;这个难度很大的。 存储类 存储类主要规定了函数和变量的范围&#xff0c;在c中有这些存储类↓&#xff1a; ৹ auto&#xff08;自动判断函数是什么类型&#xff09; ৹ register (常用的变量和inline差不多&#xff0c;但应…

【Vue】computed与watch

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue⛺️稳重求进&#xff0c;晒太阳 计算属性 概念&#xff1a;基于现有的数据&#xff0c;计算出来新的属性&#xff0c;依赖的数据变化&#xff0c;自动重新计算 语法&#xff1a; 声明…

rbd快照管理、rbd快照克隆原理与实现、rbd镜像开机自动挂载、ceph文件系统、对象存储、配置对象存储客户端、访问Dashboard

目录 快照 快照克隆 开机自动挂载 ceph文件系统 使用MDS 对象存储 配置服务器端 配置客户端 访问Dashborad 快照 快照可以保存某一时间点时的状态数据快照是映像在特定时间点的只读逻辑副本希望回到以前的一个状态&#xff0c;可以恢复快照使用镜像、快照综合示例 #…

《SQLi-Labs》05. Less 29~37

title: 《SQLi-Labs》05. Less 29~37 date: 2024-01-17 22:49:10 updated: 2024-02-12 18:09:10 categories: WriteUp&#xff1a;Security-Lab excerpt: HTTP 参数污染&#xff0c;联合注入、宽字节注入。 comments: false tags: top_image: /images/backimg/SunsetClimbing.p…

【leetcode】100. 相同的树

题目链接 100. 相同的树 bool isSameTree(struct TreeNode* p, struct TreeNode* q) {if (p && q) {return p->val q->val // 分解&& isSameTree(p->left, q->left)&& isSameTree(p->right, q->right);} else if (p NULL &&…

Linux第50步_移植ST公司的linux内核第2步_编译ST公司的linux源码和修改网络驱动

1、修改“linux-5.4.31”目录下的“Makefile” 1)、使用VSCode打开“linux-5.4.31.code-workspace” 2)、点击“linux-5.4.31”目录下的“Makefile” 3)、点击“编辑”&#xff0c;点击“查找”&#xff0c;输入“CROSS_COMPILE回车”&#xff0c;找到“ARCH ? $(SUBARCH)”…

回归预测模型:MATLAB岭回归和Lasso回归

1. 岭回归和Lasso回归的基本原理 1.1 岭回归&#xff1a; 岭回归&#xff08;Ridge Regression&#xff09; 是一种用于共线性数据分析的技术。共线性指的是自变量之间存在高度相关关系。岭回归通过在损失函数中添加一个L2正则项&#xff08; λ ∑ j 1 n β j 2 \lambda \s…