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.hqwc.cn/news/466358.html

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

相关文章

【JAVA-Day76】Java线程解析:三态和五态

Java线程解析&#xff1a;三态和五态 《Java线程状态深度解析&#xff1a;三态和五态探秘 &#x1f60e;》摘要引言一、什么是三态 &#x1f60a;二、什么是五态 &#x1f603;三、五态之间如何转变3.1 新建状态转换到运行状态3.2 运行状态转换到阻塞状态3.3 运行状态转换到等待…

为什么Python是数据科学家的首选语言

这篇文章全面探讨了Python作为数据科学领域首选语言的原因。从Python的历史、特性&#xff0c;到在数据科学中的应用实例&#xff0c;再到与其他数据科学语言的比较&#xff0c;以及在实际企业中的应用&#xff0c;我们深入剖析了Python的优势与挑战&#xff0c;最后对Python的…

【原创 附源码】Flutter安卓及iOS海外登录--Facebook登录最详细流程

最近接触了几个海外登录的平台&#xff0c;踩了很多坑&#xff0c;也总结了很多东西&#xff0c;决定记录下来给路过的兄弟坐个参考&#xff0c;也留着以后留着回顾。更新时间为2024年2月12日&#xff0c;后续集成方式可能会有变动&#xff0c;所以目前的集成流程仅供参考&…

详细分析Redis中数值乱码的根本原因以及解决方式

目录 前言1. 问题所示2. 原理分析3. 拓展 前言 对于这方面的相关知识推荐阅读&#xff1a; Redis框架从入门到学精&#xff08;全&#xff09;Java关于RedisTemplate的使用分析 附代码java框架 零基础从入门到精通的学习路线 附开源项目面经等&#xff08;超全&#xff09; …

nginx2

mkdir /usr/local/develop cd /usr/local/develop 下载 wget http://nginx.org/download/nginx-1.17.4.tar.gz yum install git git clone https://github.com/arut/nginx-rtmp-module.git 解压文件 tar zxmf nginx-1.17.4.tar.gz 进入解压目录 cd nginx-1.17.4/ 安装编译…

Ocr之TesseractOcr的安装及使用

目录 一、安装环境 二、安装内容 三、安装过程及识别测试 1. 安装过程 2. 程序编写 总结 1. 安装复杂度较低 2. 国外开源Ocr 3. 可设置识别参数 4. 工具类 一、 系统环境windows 10 linux环境也可安装, 可借鉴此篇文章>> | 二、安装内容 Tesseract exe 程序安…

锐捷(二十一)全局地址绑定

vlan划分和vlanif接口配置略&#xff0c;注意vlanif接口里要no shutdown配置如下&#xff1a; Address-bind 192.168.1.1 AAAA.BBBB.CCCCAddress-bind uplink g0/0Address-bind binding-filter loggingAddress-bind install 此时&#xff0c;IP为192.168.1.1 mac地址为AAAA.B…

2022年9月电子学会青少年软件编程 中小学生Python编程等级考试二级真题解析(选择题)

2022年9月Python编程等级考试二级真题解析 选择题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 1、运行以下代码&#xff0c;结果输出的是 means[Thank,You] print(len(means)) A、1 B、2 C、6 D、8 答案&#xff1a;B 考点分析&#xff1a;考…

前端JavaScript篇之对象继承的方式有哪些?

目录 对象继承的方式有哪些&#xff1f;1. 原型链继承2. 借用构造函数3. 组合继承4. 原型式继承5. 寄生式组合继承 对象继承的方式有哪些&#xff1f; 1. 原型链继承 当使用原型链继承时&#xff0c;子类型的原型对象被设置为父类型的一个实例。这意味着子类型通过其原型可以…

【知识整理】技术新人的培养计划

一、培养计划落地实操 1. 概要 新人入职&#xff0c;要给予适当的指导&#xff0c;目标&#xff1a; 1、熟悉当前环境&#xff1a; 生活环境&#xff1a;吃饭、交通、住宿、娱乐 工作环境&#xff1a;使用的工具&#xff0c;Mac、maven、git、idea 等 2、熟悉并掌握工作技…

苹果Mac键盘如何将 F1 到 F12 取消按Fn

苹果电脑安装了Win10操作系统之后&#xff0c;F1到F12用不了怎么办的解决方法。本文将介绍一些解决方法&#xff0c;帮助您解决无法使用F1到F12功能键的问题。 使用 Mac系统的人都知道&#xff0c;Mac系统默认是没有开启 F1-F12 的使用的&#xff0c;平时我们使用的系统都可以使…

C++三剑客之std::optional(一) : 使用详解

相关文章系列 C三剑客之std::optional(一) : 使用详解 C三剑客之std::any(一) : 使用 C之std::tuple(一) : 使用精讲(全) C三剑客之std::variant(一) : 使用 C三剑客之std::variant(二)&#xff1a;深入剖析 目录 1.概述 2.构建方式 2.1.默认构造 2.2.移动构造 2.3.拷贝构…