当前位置: 首页 > news >正文

Android C++系列:函数知识知多少

1. 背景

函数可以理解为功能的封装,很基础的功能单元,但是因为它虽然看似简单,但是里面涉及了不少知识点和技巧,我们花一篇文章来整理。

2. 函数定义

函数有以下几部分定义:

  • 返回类型
  • 函数名称
  • 形参列表
  • 函数体

函数调用的形式是函数名(),函数调用过程涉及到控制权转移。

函数体其实是一个语句块,语句块会涉及到作用域的问题,在函数方法体内定义的变量都是局部变量,局部变量会在函数执行完后被销毁,所以我们不给函数返回局部变量。

在函数体内定义的static类型对象称为局部静态对象,局部静态对象一旦定义和初始化,会直到程序终止时才会被销毁,最常用的场景是我们统一函数调用次数,可以在函数体内定义一个static局部静态对象,然后每调用一次累加一次。

3. 实参与形参

实参是形参的初始值,实参的类型必须与对应的形参匹配。

函数的形参列表可以为空,也可以有多个值,甚至新版本还为我们提供了可变参数。

只存在于块执行期间的对象称为自动对象,形参就是一种自动对象,在函数开始时为形参申请存储空间,函数终止,形参也会被销毁。实参会初始化形参对应的自动对象。

我们每次调用函数时都会重新创建它的形参,并用传入的实参对形参进行初始化。形参初始化过程和变量初始化一个道理。

实参初始化形参分两种:

  • 引用传递
  • 值传递(拷贝)

有种情况是形参是指针,当指针拷贝时,拷贝的是指针的值,拷贝完后,两个指针是不同的指针。但是由于它们指向同一块地方,所以可以通过指针修改它指向对象的值。

最佳实践:

  • 我们要尽量使用引用避免拷贝,特别是特别大的类类型对象或者容器时,拷贝会影响效率。
  • 当函数无须修改引用形参的值时,我们尽量使用常量引用。

3.1 const形参

我们知道C++中,允许我们定义不同形参列表相同名字的函数,不同形参指形参类型或者形参数量。但是如果只是一个函数除了const修饰外,其他形参都相同,那么这两个函数算同一个函数。为什么呢?因为类似于变量赋值,实参初始化形参时,会忽略顶层const。

4. 函数声明

函数也类似于变量,使用之前必须声明。而且函数只能定义一次,但是可以声明多次。如果函数一直不会被调用到,可以只声明不定义。声明和定义的唯一区别就是声明不需要函数体,也不需要形参名字,但是为了见名知意,我们声明时也尽量加上形参名。

我们一般在头文件中声明函数,在源文件中提供定义。

与C语言类似,C++也是分离式编译,分离式编译允许我们把程序分割到几个文件中,每个文件独立编译。

5. 总结

本文介绍了C++函数的基础知识,大部分跟C语言很类似。本文主要介绍了基础的实参形参、函数声明相关的概念和知识。

相关文章:

  • Linux时间子系统7:sleep timer接口定时实现
  • Anti-human IL-10 mAb (12G8), biotin:Mabtech热销品
  • vue大作业-实现学校官网
  • 【杂记-浅谈Sequence Number/序列号】
  • 第三方美颜SDK开发详解:直播美颜工具的功能与技术实现
  • upload-labs第十二关教程
  • 【Redis】基于Redission实现分布式锁(代码实现)
  • macOS聚集搜索功能开启与关闭
  • Excel/WPS《超级处理器》功能介绍与安装下载
  • 判断单链表是否带环且返回节点
  • 云原生巡检监控报告
  • newtonsoft.json动态读取json以及动态生成
  • vue2 + element-ui,前端配置化表单封装(2024-06-14)
  • 对象的扩展
  • Golang 并发编程(Goroutine、Channels、Select、Sync、原子操作函数、Context、gpool)
  • 《微软的软件测试之道》成书始末、出版宣告、补充致谢名单及相关信息
  • Apache的基本使用
  • C++类中的特殊成员函数
  • CAP理论的例子讲解
  • GraphQL学习过程应该是这样的
  • Java精华积累:初学者都应该搞懂的问题
  • puppeteer stop redirect 的正确姿势及 net::ERR_FAILED 的解决
  • React as a UI Runtime(五、列表)
  • TypeScript实现数据结构(一)栈,队列,链表
  • webpack+react项目初体验——记录我的webpack环境配置
  • 浮动相关
  • 给新手的新浪微博 SDK 集成教程【一】
  • 区块链将重新定义世界
  • 如何设计一个微型分布式架构?
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 通过git安装npm私有模块
  • 小程序 setData 学问多
  • 用 Swift 编写面向协议的视图
  • 正则表达式小结
  • 走向全栈之MongoDB的使用
  • 《码出高效》学习笔记与书中错误记录
  • 带你开发类似Pokemon Go的AR游戏
  • ​io --- 处理流的核心工具​
  • ​软考-高级-信息系统项目管理师教程 第四版【第19章-配置与变更管理-思维导图】​
  • # include “ “ 和 # include < >两者的区别
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (C语言)编写程序将一个4×4的数组进行顺时针旋转90度后输出。
  • (c语言版)滑动窗口 给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (分布式缓存)Redis哨兵
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (论文阅读32/100)Flowing convnets for human pose estimation in videos
  • (每日一问)基础知识:堆与栈的区别
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (转)项目管理杂谈-我所期望的新人
  • .gitignore文件设置了忽略但不生效
  • .net 8 发布了,试下微软最近强推的MAUI
  • .NET 设计模式—简单工厂(Simple Factory Pattern)