【C++知识点总结全系列 (03)】:函数(函数参数传递、可变参数、函数返回值等详细介绍)

函数

  • 1、函数基本概述
    • (1)What(什么是函数)
    • (2)Why(函数的作用)
    • (3)How(如何声明和定义函数)
      • A.声明函数
      • B.定义函数(实现)
  • 2、函数参数
    • (1)传递方式
      • A.值传递
      • B.指针传递
      • C.引用传递
    • (2)const的形参和实参
    • (3)数组形参
    • (4)可变参数
      • A. initializer_list
      • B. 省略符形参
  • 3、函数的返回值
    • (1)返回值是引用类型
    • (2)返回值类型是初始化列表
    • (3)返回值是decltype
    • (4)尾至返回值类型
  • 4、内联函数和constexpr
    • (1)What(什么是内联函数)
    • (2)Why(内联函数的作用)
    • (3)constexpr函数
      • A.What(什么是constexpr函数)
      • B.How(如何使用constexpr函数)
  • 5、函数指针
    • (1)What(什么是函数指针)
    • (2)How(如何使用函数指针)
  • 6、总结

1、函数基本概述

(1)What(什么是函数)

一段可重用的代码,包含参数列表、函数名和返回值。
本质:对输入的数据进行处理并得到输出结果。

(2)Why(函数的作用)

  • 重用性:避免重复编写相同的代码
  • 模块化:函数将代码分割成独立的小型模块,每个函数完成一个特定任务,使得程序的结构更加清晰
  • 抽象化:使用函数的人只需要关注函数的输入和输出,无需了解函数的内部实现
  • 可维护性:当需要修改程序的时候,只需要对特定的函数进行修改即可,而不需要改动整个程序

(3)How(如何声明和定义函数)

A.声明函数

返回值类型 函数名(参数列表) ;如:

/*
*@brief 得到两个整数的和
*@param[in] ia,
*@param[in] ib,
*@param[out] iSum, 输出参数,ia和ib之和的结果,这里传入的是引用
*/
void GetSum(int ia, int ib, int &iSum);

B.定义函数(实现)

void GetSum(int ia, int ib, int &iSum)
{
	iSum = ia + ib;
}

注意:分离式编译,这一概念必须清晰,在实际项目中一定要用到。即把函数原型或类的声明放在一个单独的文件中(头文件.hpp),函数的实现或类的实现放在另一个单独的文件中(.cpp)

2、函数参数

(1)传递方式

A.值传递

单向传递,函数内对参数的操作不会影响实参

int add(int a, int b)
{
	return a+b;
}

B.指针传递

函数内对参数的操作可以影响实参,这里使用的是”可以“,是因为如果指针参数前面添加了const,那么则不能修改实参的值

C.引用传递

函数内对参数的操作可以影响实参

说明:引用和指针做形参时的区别:指针变量本身被重新赋值时,不会影响到实参;引用本身 被重新赋值时,会影响到实参

(2)const的形参和实参

非const的实参可以传入到const形参中,而const实参不能传入到非const形参中

(3)数组形参

使用是会将其转换成指针,无法以值传递的方式传递数组

void test(const int*);
void test(const int[]);
void test(const int[10]);

数组引用形参

void print(int (&arr)[10])
{
	...
}

多维数组做形参

int *a[10]; //十个指针构成的数组
int (*a)[10]; //指向含有10个整数的数组的指针

(4)可变参数

A. initializer_list

在这里插入图片描述

B. 省略符形参

void foo(int a, ...);

也可以实现多参数的传递,但省略符形参无法被正确拷贝

注意:函数的形参中,一旦某个形参被赋予默认值,它后面的所有形参都必须有默认值

3、函数的返回值

(1)返回值是引用类型

调用一个返回引用的函数得到的是左值,其他类型返回的是右值

(2)返回值类型是初始化列表

std::initializer_list<int> get_list()
{
	return {1976, 1978, 1998, 2008, 2015, 2020, 2024, 2026};
}

(3)返回值是decltype

int a[] = {1,3,5};
int b[] = {2,4,6};
decltype(a) *getArrPtr(int i)
{
	return 	(i % 2 ==0) ? &a : &b;
}

(4)尾至返回值类型

在这里插入图片描述

4、内联函数和constexpr

(1)What(什么是内联函数)

被关键字inline修饰的函数

inline void show(const string &strSentence);

(2)Why(内联函数的作用)

避免函数调用时引起的开销:保存现场环境、地址反复跳转等开销

(3)constexpr函数

A.What(什么是constexpr函数)

在编译期间就能得到值,需要保证其函数体中只包含不依赖于运行时状态的代码,具体来说,只能使用常量值、枚举、非递归的结构体、指向函数或对象的指针等,不允 许使用运行时变量、分支语句和循环语句等

B.How(如何使用constexpr函数)

constexpr int factorial(int n)
{
	return (n<=1) ? 1 : n*factorial(n-1);
}

int main()
{
	constexpr int f5 = factorial(5);
	std::cout<<"Factorial of 5 is: "<<f5<<std::endl;
	return 0;
}	

不能出现运行时变量

注意:一般将inline函数和constexpr函数放在头文件中

5、函数指针

(1)What(什么是函数指针)

函数指针本质是一个指针,它指向的是一个函数,而不是对象

bool (*pf)(const int&, const int &);

(2)How(如何使用函数指针)

bool bigger(const int &a, const int &b)
{
	return (a>b);
}

bool (*pf)(const int &a,const int&b);
pf = bigger; //or pf=&bigger;
bool bFlag = pf(10,20); 
bool bFlag02 = (*pf)(10,20);
bool bFlag03 = bigger(10,20);

6、总结

在这里插入图片描述

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

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

相关文章

PHP房产小程序微信小程序系统源码

&#x1f3e0;—— 购房租房&#xff0c;一“指”搞定&#x1f3e1; &#x1f50d;【开篇&#xff1a;房产新视界&#xff0c;尽在掌握】 在这个信息爆炸的时代&#xff0c;找房子不再是一场漫长的奔波。有了“房产微信小程序”&#xff0c;无论是购房还是租房&#xff0c;都…

飞时达软件,揭开土方工程师的生活“面纱”

作为一名从事土方施工项目5年的工程师小刘,工作中遇到的最头疼的问题,就是如何快速准确地计算出每个土块的土方量。从前都是手动在设计图上量取,容易出错且耗时。直到有一天,他通过同事的推荐下载了飞时达软件,从此改变了他的土方计算生活。 从乏味到休闲,计算工作多了乐趣 小…

python 打包成exe出错——No module named ‘tkinter‘

问题&#xff1a;执行 pyinstaller 打包之后 的exe 文件时&#xff0c;提示以下信息 Traceback (most recent call last):File "xxx.py", line 6, in <module> ModuleNotFoundError: No module named tkinter [18720] Failed to execute script xxx due to un…

Linux—文件内系统与日志分析

目录 一、Linux文件系统 1、inode 与 block概述 1.2、inode内容 1.3、查找inode 1.4、inode故障处理 2、硬盘分区后的结构 3、访问文件的流程 4、文件恢复 4.1、恢复ext3格式文件 4.2、恢复 xfs 格式文件 二、Linux日志文件 1、日志的功能 2、日志的默认位置 3、日…

解决pip默认安装位置在C盘方法

新版python中使用pip命令将opencv库安装到base环境中 首先我们打开命令控制窗口&#xff0c;激活base环境&#xff0c;输入conda activate base 然后检查一下自己base环境中是否安装opencv库&#xff0c;输入conda list 往下找&#xff0c;找到o开头的地方&#xff0c;发现是…

【HTML入门】第一课 - 网页标签框架

这一节&#xff0c;我们说一下学习前端开发的话&#xff0c;最入门的也是非常重要的一门可成&#xff0c;也就是HTML。HTML标签&#xff0c;是网页的重要组成部分&#xff0c;可以说&#xff0c;你看到网页上的内容&#xff0c;都是基于HTML标签呈现出来的。 这一小节呢&#…

怎么录制电脑内部声音?好用的录音软件分享,看这篇就够了!

如何录制电脑内部声音&#xff1f;平时使用电脑工作&#xff0c;难免会遇到需要录音的情况。好用的录音软件有很多&#xff0c;也有部分录屏工具也支持录音功能。 那么如何录制电脑内部声音呢&#xff1f;本文整理了几个录制电脑内部声音的方法&#xff0c;如果你需要在电脑上录…

nacos开启鉴权后,springboot注册失败

1.确认Nacos版本 我的Nacos版本是1.4.2 2.确认Nacos相关依赖的版本之间兼容&#xff0c;一下是我的一些pom.xml依赖 <!--父级项目的--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifa…

推荐一个私有化部署的物联网平台

引言 随着物联网技术的飞速发展&#xff0c;越来越多的企业开始寻求能够提供稳定、安全、可定制的物联网解决方案。私有化部署的物联网平台因其能够满足企业对数据安全和个性化需求的优势&#xff0c;逐渐成为市场的新宠。本文将详细介绍ThingsKit物联网平台&#xff0c;一个专…

微软发布了Win11 24H2版本的首个设置动态更新和恢复!

系统之家于7月3日发出最新报道&#xff0c;微软针对Win11 24H2版本发布了首个设置动态更新(Setup Dynamic Update)KB5039448。此次更新主要改进了Win11 24H2的安装文件以及用户在升级、安装到24H2版本过程中可能会使用到的所有文件。 系统之家附上 Windows 11 24H2 的完整发布时…

刷代码随想录有感(125):动态规划——最长公共子序列

题干&#xff1a; 代码&#xff1a; class Solution { public:int longestCommonSubsequence(string text1, string text2) {vector<vector<int>>dp(text1.size() 1, vector<int>(text2.size() 1, 0));for(int i 1; i < text1.size(); i){for(int j …

AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理

AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理 目录 AGI 之 【Hugging Face】 的【Transformer】的 [ Transformer 架构 ] / [ 编码器 ]的简单整理 一、简单介绍 二、Transformer 三、Transformer架构 四、编码器 1、自注意…

PyCharm社区版Cython支持

自己在文件类型中加一个&#xff0c;名称叫【pythonC】 &#xff0c;文件名模式这一栏要加*.pyx的后缀&#xff0c;之后双击【pythonC】编辑这个文件类型 这里1、2、3、4配置如下 # 1 " # &*, - / : ; <>[ ] { }# 2 False None True and as assert break cdef …

Python代码设置Excel工作表背景色或背景图

Excel是工作中数据处理和分析数据的重要工具。面对海量的数据和复杂的表格&#xff0c;如何提高工作效率、减少视觉疲劳并提升数据的可读性是不容忽视的问题。而给工作表设置合适的背景是表格优化的一个有效方式。为Excel工作表设置背景色或背景图不仅能够美化工作表&#xff0…

FreeRTOS学习 -- 软件定时器

一、软件定时器简介 1、软件定时器概述 软件定时器允许设置一段时间&#xff0c;当设置的时间到达之后就执行指定的功能函数&#xff0c;被定时器调用的这个功能函数叫做定时器的回调函数。回调函数的两次执行间隔叫做定时器的定时周期。 简而言之&#xff0c;当定时器的定时…

Postman接口测试工具详解【保姆级教程】

大家好,我是CodeQi! 在我们日常的开发工作中,无论是前端还是后端,API 接口的测试都是必不可少的一环。 你有没有遇到过这样的情况:接口测试工具复杂难用,使用起来让人抓狂;或者手动构造请求效率低下,容易出错? 别担心,我今天要介绍的 Postman 工具,将会彻底改变你…

某业帮六月校招后端笔试

题目一 解题思路 签到题&#xff0c;dp就行。 题目二 解题思路 这个比较烦人&#xff0c;需要处理额外的引号和括号。用DFS&#xff0c;对于每个间隙&#xff0c;插入与不插入都搜一遍。 题目三 解题思路&#xff1a; 双指针&#xff0c;左右各一个指针&#xff0c;对比长度&…

一文解开关于UWB定位技术的认识误区

作为一项新兴技术产业&#xff0c;UWB定位技术具有无限发展潜力。尤其是在TB行业应用中&#xff0c;UWB定位部分在项目的产值占比为10%-20%之间&#xff0c;这便意味着&#xff0c;UWB定位市场可以撬动其本身市场产值的5-10倍。 然而&#xff0c;伴随着UWB定位技术的迅速发展&a…

MySQL数据库增删改查示例

一、 1、登陆数据库 2、创建数据库zoo 3、修改数据库zoo字符集为gbk 4、选择当前数据库为zoo 5、查看创建数据库zoo信息 6、删除数据库zoo 二、创建俩张表 先创建一个数据库并使用&#xff1a; 创建员工表 创建员工绩效表 三、修改表 1.在员工表的基本上增加一个image系列&a…

如何使用小红书矩阵系统:提升内容管理与发布的指南

小红书作为一个集社区分享与电商功能于一体的平台&#xff0c;吸引了大量的用户和创作者。随着内容创作和账号管理的复杂性增加&#xff0c;小红书矩阵系统成为了一个强大的工具&#xff0c;帮助用户提高效率和扩大影响力。本文将详细介绍如何使用小红书矩阵系统&#xff0c;以…