C++:函数的概述

在C++中,函数是用来执行特定任务或操作的独立的代码块。函数有助于将程序分解为较小的、可维护的部分,提高了代码的可读性、可重用性和模块性。下面是定义和使用C++函数的一般步骤以及基本语法:

函数的作用:

函数用于封装一组相关的操作,通过函数的名称来调用这些操作。函数的作用包括但不限于:

  1. 执行特定的计算或操作。
  2. 使代码更加模块化和易于理解。
  3. 实现代码的重用。
  4. 提高代码的可维护性和可读性。
  5. 允许参数传递,使函数更通用和灵活。

定义函数的五个步骤:

以下是定义C++函数的一般步骤:

  1. 函数声明(可选): 在使用函数之前,通常需要提供函数的声明,以告诉编译器函数的名称、返回类型和参数列表。声明可以放在函数的调用之前或使用头文件。例如:

    int add(int a, int b); // 函数声明
    

  2. 函数定义: 在程序的某个位置,定义函数的实际代码块。函数定义包括函数的返回类型、函数名称、参数列表和函数体。例如:

    int add(int a, int b) {return a + b; // 函数体
    }
    

  3. 函数调用: 在程序中的任何地方,可以使用函数的名称和参数列表来调用函数,执行函数的代码块,并获取结果(如果有返回值)。例如:

    int result = add(5, 3); // 调用函数
    

  4. 传递参数: 在函数调用时,将参数传递给函数。参数可以是零个或多个,根据函数的定义。参数的值在函数内部使用。例如:

    int result = add(5, 3); // 5和3是参数
    

  5. 返回值: 函数可以返回一个值,这个值可以在函数调用后使用。返回值的类型与函数的返回类型相匹配。例如:

    int add(int a, int b) {return a + b; // 返回值为a和b的和
    }
    

函数的基本语法格式: 

  • 返回类型:指定函数返回的数据类型(如int、double、void等)。
  • 函数名称:函数的标识符,用于调用函数。
  • 参数列表:指定函数接受的参数,可以是零个或多个参数,每个参数包括类型和名称。
  • 函数体:包含函数执行的实际代码块。
  • return语句(可选):用于返回一个值,并终止函数的执行。如果函数的返回类型是void,则可以省略return语句。

Cpp函数的值传递问题简述:

C++中的函数参数传递方式包括值传递(pass by value)、引用传递(pass by reference)和指针传递(pass by pointer)等方式。在这里,我们简述一下值传递方式。

值传递(Pass by Value):

值传递是一种函数参数传递方式,其中函数的形参(参数)接收实际参数(传入的参数)的值副本,而不是直接引用实际参数本身。这意味着在函数内部对形参的修改不会影响到实际参数的值。

以下是值传递的特点和注意事项:

  • 形参接收实际参数的值副本。
  • 对形参的任何修改不会影响到实际参数。
  • 值传递适用于不希望函数修改实际参数的情况。
  • 值传递的操作会复制实际参数的值,可能会导致性能开销,尤其在处理大型数据结构时。

下面是一个示例,展示了值传递的情况:

#include <iostream>void modifyValue(int x) {x = x * 2; // 修改形参x的值
}int main() {int num = 5;modifyValue(num);std::cout << "Value after function call: " << num << std::endl;return 0;
}

在这个示例中,modifyValue 函数接收一个整数参数 x,并在函数内部将其值加倍。然而,当我们在 main 函数中调用 modifyValue 时,实际参数 num 的值没有被修改,因为函数参数是通过值传递方式传递的,只有 x 的副本被修改。

引用传递和指针传递是两种不同的函数参数传递方式,它们允许函数访问和修改实际参数的内存位置,与值传递方式相比更具有灵活性和功能。下面分别讲解引用传递和指针传递方式:

引用传递(Pass by Reference):

在引用传递中,函数的形参是对实际参数的引用。这意味着函数参数不是实际参数的副本,而是直接引用了实际参数的内存地址。因此,对形参的修改会影响到实际参数的值。

void functionName(Type& parameterName) {// 函数体
}
#include <iostream>void modifyValue(int& x) {x = x * 2; // 修改引用参数x的值,也会修改实际参数
}int main() {int num = 5;modifyValue(num);std::cout << "Value after function call: " << num << std::endl;return 0;
}

在上述示例中,modifyValue 函数接受一个整数引用 x,并在函数内部将其值加倍。当我们在 main 函数中调用 modifyValue 时,实际参数 num 的值也被修改,因为 x 是对 num 的引用。

指针传递(Pass by Pointer):

在指针传递中,函数的形参是一个指针,该指针存储了实际参数的内存地址。通过在函数内部解引用指针,可以访问和修改实际参数的值。

语法:
void functionName(Type* parameterName) {// 函数体
}
#include <iostream>void modifyValue(int* ptr) {*ptr = (*ptr) * 2; // 通过指针修改实际参数的值
}int main() {int num = 5;modifyValue(&num); // 将实际参数的地址传递给函数std::cout << "Value after function call: " << num << std::endl;return 0;
}

在上述示例中,modifyValue 函数接受一个整数指针 ptr,并在函数内部通过指针修改了实际参数 num 的值。在函数调用时,我们需要将 num 的地址传递给函数,即使用 &num

区别:

引用传递(Pass by Reference):

  1. 语法:使用引用作为函数参数。函数声明和定义中的参数类型是引用(例如,Type& parameterName)。

  2. 操作符:在函数内部,使用变量名(引用参数名)直接操作实际参数。

  3. 空指针:不会引发空指针异常,因为引用始终引用一个有效的对象。

  4. 可选性:引用传递通常不允许在函数内部重新绑定(修改)引用,因为引用一旦与某个对象绑定,就不能更改为引用另一个对象。

指针传递(Pass by Pointer):

  1. 语法:使用指针作为函数参数。函数声明和定义中的参数类型是指针(例如,Type* parameterName)。

  2. 操作符:在函数内部,使用指针解引用操作符*来访问实际参数的值

  3. 空指针:需要谨慎处理指针可能为空的情况,否则可能导致空指针异常

  4. 可选性:可以在函数内部重新分配指针,将其指向不同的对象

总结:

  • 引用传递更接近于对实际参数的别名,更容易理解和使用,但不允许在函数内部重新绑定引用。

  • 指针传递提供了更多的灵活性,允许在函数内部重新分配指针,但需要更小心处理指针可能为空的情况。(具体后续学习过程中再深度理解)

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

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

相关文章

【Linux】线程安全

线程互斥互斥相关背景概念 互斥量mutex互斥量接口初始化互斥量函数销毁互斥量互斥量加锁互斥量解锁代码模拟 互斥量实现的逻辑常见锁的概念死锁什么叫做阻塞&#xff1f;产生死锁的四个必要条件如何避免死锁 Linux线程同步同步概念与竞态条件条件变量条件变量函数代码练习 条件…

pytest之parametrize()实现数据驱动

第一个参数是字符串&#xff0c;多个参数中间用逗号隔开 第二个参数是list,多组数据用元组类型;传三个或更多参数也是这样传。list的每个元素都是一个元组&#xff0c;元组里的每个元素和按参数顺序一一对应 传一个参数 pytest.mark.parametrize(‘参数名’&#xff0c;list)…

【Spring Boot】拦截器学习笔记

一、普通拦截器 1&#xff0c;新建类MyWebConfig实现WebMvcConfigurer&#xff0c;实现addInterceptors方法 Overridepublic void addInterceptors(InterceptorRegistry registry) {registry// 不拦截哪些请求.excludePathPatterns("/login")// 拦截哪些请求.addPat…

Kubernetes 上的数据已跨越鸿沟:在 GKE 上运行有状态应用程序的案例

Kubernetes 是当今云原生开发的事实上的标准。长期以来&#xff0c;Kubernetes 主要与无状态应用程序相关&#xff0c;例如 Web 和批处理应用程序。然而&#xff0c;与大多数事物一样&#xff0c;Kubernetes 也在不断发展。如今&#xff0c;我们看到 Kubernetes 上有状态应用程…

(二十八)mmdetection实用工具: Visualization

目录 一、基础绘制接口二、基础存储接口三、任意点位进行可视化 一、基础绘制接口 可视化器&#xff08;Visualizer&#xff09;&#xff1a;可视化器负责对模型的特征图、预测结果和训练过程中产生的结构化日志进行可视化&#xff0c;支持 Tensorboard 和 WanDB 等多种可视化…

在docker中删除none镜像

在构建过Docker镜像的电脑上查看本地镜像列表&#xff0c;有可能看到下图红框中的镜像&#xff0c;在列表中展示为:&#xff1a; 这种镜像在Docker官方文档中被称作dangling images&#xff0c;指的是没有标签并且没有被容器使用的镜像。 官方解释 来自官方的解释如下图红框所…

Springboot配置文件 - 多环境开发、自定义配置文件、多环境开发控制

文章目录 配置文件一、Yaml 文件1.1 修改banner1.2 日志1.3 端口1.4 属性提示消失解决方案 二、Properties 文件三、配置高级3.1 临时属性3.2 临时属性&#xff08;开发环境&#xff09;3.3 配置文件四级分类3.3.1 原始配置文件&#xff08;四级&#xff09;3.3.2 config目录下…

Rust vs C++ 深度比较

Rust由于其强大的安全性受到大量关注&#xff0c;被认为C在系统编程领域最强大的挑战者。本文从语言、框架等方面比较了两者的优缺点。原文: Rust vs C: An in-depth language comparison Rust和C的比较是开发人员最近的热门话题&#xff0c;两者之间有许多相似之处&#xff0c…

少数人的晚餐-补充

与此相关的四篇博客&#xff1a; 坦然~佛系~_坦然 佛系 zhangrelay-CSDN博客 少数人的晚餐_zhangrelay的博客-CSDN博客 ROS1/2机器人课程的价值和规模-CSDN博客 从2050回顾2020&#xff0c;职业规划与技术路径&#xff08;节选&#xff09;补充-CSDN博客 回顾 少数人的晚餐…

手把手教你制作精美的新店开业微传单

如果你准备开设一家新店&#xff0c;那么制作一份具有吸引力的微传单是宣传店铺的重要手段之一。下面&#xff0c;我们将通过乔拓云平台&#xff0c;手把手教你制作一份有吸引力的新店开业微传单。 1. 注册并登录乔拓云账号 首先&#xff0c;你需要在乔拓云官方网站注册一个账号…

加速企业AI实施:成功策略和效率方法

文章目录 写在前面面临的挑战MlOps简介好书推荐 写作末尾 写在前面 作为计算机科学领域的一个关键分支&#xff0c;机器学习在当今人工智能领域中占据着至关重要的地位&#xff0c;广受瞩目。机器学习通过深入分析大规模数据并总结其中的规律&#xff0c;为我们提供了解决许多…

机器学习---BP算法

1. 多级网络 层号确定层的高低&#xff1a;层号较小者&#xff0c;层次较低&#xff0c;层号较大者&#xff0c;层次较高。 输入层&#xff1a;被记作第0层。该层负责接收来自网络外部的信息。 第j层&#xff1a;第j-1层的直接后继层&#xff08;j>0&#xff09;&#xff…

使用Kalibr工具线对相机+IMU离线标定

传感器标定的准确后面做算法才会更准确&#xff0c;所以对Kalibr进行学习。 一、Kalibr编译 1、下载kalibr包 GitHub下载地址 2、 解压后放到/catkin_ws/src文件夹下 重新命令文件夹为kalibr 3、 安装依赖库 sudo apt-get install python-setuptools python-rosinstall…

css实现渐变电量效果柱状图

我们通常的做法就是用echarts来实现 比如 echarts象形柱图实现电量效果柱状图 接着我们实现进阶版&#xff0c;增加渐变效果 echarts分割柱形图实现渐变电量效果柱状图 接着是又在渐变的基础上&#xff0c;增加了背景色块的填充 echarts实现渐变电量效果柱状图 其实思路是一…

深度学习(1)---卷积神经网络

文章目录 一、发展历史1.1 CNN简要说明1.2 猫的视觉实验1.3 新认知机1.4 LeNet-51.5 AlexNet 二、卷积层2.1 图像识别特点2.2 卷积运算2.3 卷积核2.4 填充和步长2.5 卷积计算公式2.6 多通道卷积 三、池化层 一、发展历史 1.1 CNN简要说明 1. 卷积神经网络&#xff08;Convolut…

Spring源码分析 事务 实现原理

文章目录 什么是事务Spring事务管理Spring事务实现原理事务管理器事务定义事务的开启事务核心方法业务代码使用事务TransactionInterceptor 什么是事务 一般所指的事务是数据库事务&#xff0c;是指一批不可分割的数据库操作序列&#xff0c;也是数据库并发控制的基本单位。其…

26591-2011 粮油机械 糙米精选机

声明 本文是学习GB-T 26591-2011 粮油机械 糙米精选机. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 1 范围 本标准规定了糙米精选机的有关术语和定义、工作原理、型号及基本参数、技术要求、试验方法、检 验规则、标志、包装、运输和储存要求。 …

常见列表字典排序

一、列表排序 demoList [1, 3, 2, 4, 9 ,7]res sorted(demoList) # 默认升序# 降序 # res sorted(demoList, reverseTrue)print(res)二、字典排序 demoDict {"篮球": 5, "排球": 9, "网球": 6, "足球": 3}# sorted排序 res so…

Spring面试题21:说一说Spring的@Required注解和@Qualifier注解

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:说一说Spring的@Required注解 @Required ,用于标记在注入的属性上。它表示被注解的属性在配置 Bean 的时候是必需的,如果没有正确配置,则会抛出…

如何使用 API 接口获取商品数据,从申请 API 接口、使用 API 接口到实际应用,一一讲解

在当今的数字化时代&#xff0c;应用程序接口&#xff08;API&#xff09;已经成为数据获取的重要通道。API 接口使得不同的应用程序能够方便地进行数据交换&#xff0c;从而促进了信息的广泛传播和利用。在众多的数据源中&#xff0c;商品数据是一个非常重要的领域&#xff0c…