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

7.C++中的函数

C++中的函数

在 C++ 中,函数是一个重要的概念,它是将一段相对独立的、完成特定任务的代码封装起来的程序模块。以下是关于 C++ 中函数的详细介绍:

函数的定义

函数定义由函数头和函数体组成,其一般形式如下:

返回值类型 函数名(参数列表) {// 函数体// 执行相关操作的语句// 可以有返回值语句(如果返回值类型不是void)return 返回值;
}

例如,一个简单的加法函数可以这样定义:

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

函数的参数

  • 形式参数:在函数定义中括号内声明的参数,用于接收调用函数时传递进来的值,它就像一个占位符,在函数被调用时才会被赋予实际的值。
  • 实际参数:在函数调用时传递给函数的具体值或变量,它们将被赋值给函数的形式参数,实参可以是常量、变量、表达式等。
  • 参数传递方式
    • 值传递:将实参的值复制一份传递给形参,在函数内部对形参的修改不会影响到实参。
    • 指针传递:将实参的地址传递给形参,通过指针可以在函数内部直接访问和修改实参的值。
    • 引用传递:形参是实参的别名,对形参的操作实际上就是对实参的操作,函数内部对形参的修改会直接反映到实参上。

函数的返回值

  • 函数通过return语句返回一个值给调用者,返回值的类型在函数定义的返回值类型中指定。
  • 如果函数的返回值类型是void,则表示该函数不返回任何值,这种函数通常用于执行一些特定的操作,如打印信息、修改全局变量等。

函数的调用

当需要执行函数中的代码时,就需要调用函数。函数调用的一般形式为:函数名(实参列表)。例如,调用前面定义的add函数:

int main() {int result = add(3, 5);std::cout << "结果是:" << result << std::endl;return 0;
}

函数重载

在 C++ 中,可以定义多个同名的函数,但这些函数的参数列表必须不同(参数个数、参数类型或参数顺序不同),这就是函数重载。例如:

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

内联函数

使用inline关键字声明的函数称为内联函数。在编译时,编译器会将内联函数的代码直接嵌入到调用它的地方,而不是像普通函数那样进行函数调用的跳转,这样可以减少函数调用的开销,提高程序的执行效率。例如:

inline int square(int x) {return x * x;
}

函数模板

函数模板是一种通用的函数定义方式,可以用来创建具有相同逻辑但处理不同数据类型的函数。其一般形式如下:

template <typename T>
T max(T a, T b) {return (a > b)? a : b;
}

在使用函数模板时,编译器会根据实际调用时传递的参数类型来自动生成相应的函数实例。

函数指针

函数指针是一种指向函数的指针变量,它可以用来存储函数的地址,并且通过函数指针可以调用其所指向的函数。函数指针的定义形式如下:

返回值类型 (*指针名)(参数列表);

例如,对于前面定义的add函数,可以定义一个函数指针来指向它:

int (*addPtr)(int, int) = add;

然后可以通过函数指针来调用函数:

int result = addPtr(3, 5);

函数指针在回调函数、函数表等场景中非常有用。

成员函数与非成员函数

  • 成员函数:是定义在类内部的函数,它可以访问类的成员变量和其他成员函数,通过类的对象或指针来调用。成员函数可以是公有(public)、私有(private)或保护(protected)的,用于实现类的行为和操作。
class MyClass {
public:void memberFunction() {// 访问成员变量等操作}
};
  • 非成员函数:定义在类外部的函数,它不属于任何类,不能直接访问类的私有成员。非成员函数通常用于实现一些与类相关但又不适合作为类成员函数的功能,或者是一些通用的功能函数。

虚函数与多态

  • 虚函数:在基类中使用virtual关键字声明的成员函数,它允许在派生类中被重新定义(覆盖)。虚函数是实现多态性的重要机制。
class Base {
public:virtual void virtualFunction() {std::cout << "Base::virtualFunction" << std::endl;}
};class Derived : public Base {
public:void virtualFunction() override {std::cout << "Derived::virtualFunction" << std::endl;}
};
  • 多态:通过使用虚函数,当用基类指针或引用指向派生类对象时,调用虚函数会根据对象的实际类型来决定调用哪个类的函数版本,从而实现多态行为。
int main() {Base* basePtr = new Derived();basePtr->virtualFunction(); // 调用Derived类的virtualFunctiondelete basePtr;return 0;
}

Lambda 表达式(匿名函数)

Lambda 表达式是 C++11 引入的一种匿名函数的语法,它可以在需要函数的地方直接定义和使用,而不需要像普通函数那样先定义再调用。Lambda 表达式的一般形式如下:

[capture list](parameters) -> return type {// 函数体
}

例如,一个简单的 Lambda 表达式用于计算两个数的和:

auto addLambda = [](int a, int b) -> int {return a + b;
};
int result = addLambda(3, 5);

Lambda 表达式在算法、函数式编程等场景中非常方便,可以作为函数对象传递给其他函数,或者用于定义临时的、一次性的函数逻辑。

相关文章:

7.C++中的函数

C中的函数 在 C 中&#xff0c;函数是一个重要的概念&#xff0c;它是将一段相对独立的、完成特定任务的代码封装起来的程序模块。以下是关于 C 中函数的详细介绍&#xff1a; 函数的定义 函数定义由函数头和函数体组成&#xff0c;其一般形式如下&#xff1a; 返回值类型 …...

上位机知识篇---Python数据图表可视化

文章目录 前言第一部分&#xff1a;Matplotlib1. 图形和轴&#xff08;Figure and Axes&#xff09;FigureAxes创建一个新的图形在图形中添加一个或多个轴 2. 绘图命令绘制折线图绘制散点图绘制条形图绘制饼图绘制直方图等高线图&#xff08;Contour plot&#xff09;&#xff…...

详解:TCP/IP五层(四层)协议模型

一.五层&#xff08;四层&#xff09;模型 1.概念 TCP/IP协议模型分为五层&#xff1a;物理层、数据链路层、网络层、传输层和应用层。这五层每一层都依赖于其下一层给它提供的网络去实现需求。 1&#xff09;物理层&#xff1a;这是最基本的一层&#xff0c;也是最接近硬件…...

【原生记忆能力 怎么让大模型拥有原生的记忆能力】

首先&#xff0c;需要明确“原生记忆能力”具体指的是什么。通常来说&#xff0c;大模型如GPT-3或GPT-4在生成回复时是基于训练数据的模式识别&#xff0c;而不是真正的记忆。所以用户可能希望模型能够持续记住之前的交互信息&#xff0c;或者在多次使用中积累知识&#xff0c;…...

百度APP iOS端磁盘优化实践(上)

01 概览 在APP的开发中&#xff0c;磁盘管理已成为不可忽视的部分。随着功能的复杂化和数据量的快速增长&#xff0c;如何高效管理磁盘空间直接关系到用户体验和APP性能。本文将结合磁盘管理的实践经验&#xff0c;详细介绍iOS沙盒环境下的文件存储规范&#xff0c;探讨业务缓…...

qml Dialog详解

1、概述 Dialog是QML&#xff08;Qt Modeling Language&#xff09;中用于显示对话框的组件&#xff0c;它提供了一个模态窗口&#xff0c;通常用于与用户进行重要交互&#xff0c;如确认操作、输入信息或显示警告等。Dialog组件具有灵活的布局和样式选项&#xff0c;可以轻松…...

2025年的校招管理系统会全面实现智能化吗?

随着科技的不断进步&#xff0c;企业的招聘方式也在不断地演变。特别是在校园招聘领域&#xff0c;传统的招聘方法已经难以满足现代企业的需求。2025年的校招管理系统是否会全面实现智能化&#xff1f;这是一个值得探讨的话题。 想象一下&#xff0c;每年的校招季&#xff0c;…...

【Unity】使用Canvas Group改变UI的透明度

目录 一、前言二、Canvas Group三、结合DOTween达到画面淡进的效果 一、前言 在平时开发中&#xff0c;可以通过控制材质、Color改变UI透明度&#xff0c;除此之外还可以CanvasGroup组件来控制透明度。 二、Canvas Group 官方文档链接&#x1f449;&#x1f449; 点击进入 …...

2024年博客之星主题创作|2024年度感想与新技术Redis学习

Redis工具深入了解 1.引言与感想2.Redis工具了解2.分布式系统了解2.1单机架构2.2分布式是什么2.3应用服务和数据库服务分离2.4引入更多的应用服务器2.5理解负载均衡器2.6数据库读写分离2.7引入缓存2.8数据库分库分表2.9引入微服务2.10分布式系统小结 1.引言与感想 2024学习了很…...

6. 马科维茨资产组合模型+政策意图AI金融智能体(DeepSeek-V3)增强方案(理论+Python实战)

目录 0. 承前1. 幻方量化 & DeepSeek1.1 What is 幻方量化1.2 What is DeepSeek 2. 重写AI金融智能体函数3. 汇总代码4. 反思4.1 不足之处4.2 提升思路 5. 启后 0. 承前 本篇博文是对上一篇文章&#xff0c;链接: 5. 马科维茨资产组合模型政策意图AI金融智能体(Qwen-Max)增…...

Unity自学之旅05

Unity自学之旅05 Unity学习之旅⑤&#x1f4dd; AI基础与敌人行为&#x1f94a; AI导航理论知识&#xff08;基础&#xff09;开始实践 &#x1f383; 敌人游戏机制追踪玩家攻击玩家子弹碰撞完善游戏失败条件 &#x1f917; 总结归纳 Unity学习之旅⑤ &#x1f4dd; AI基础与敌…...

linux中关闭服务的开机自启动

引言 systemctl 是 Linux 系统中用于管理 systemd 服务的命令行工具。它可以用来启动、停止、重启服务&#xff0c;管理服务的开机自启动&#xff0c;以及查看服务的状态等。 什么是 systemd&#xff1f; systemd 是现代 Linux 发行版中默认的 初始化系统&#xff08;init sys…...

Python----Python高级(文件操作open,os模块对于文件操作,shutil模块 )

一、文件处理 1.1、文件操作的重要性和应用场景 1.1.1、重要性 数据持久化&#xff1a; 文件是存储数据的一种非常基本且重要的方式。通过文件&#xff0c;我们可 以将程序运行时产生的数据永久保存下来&#xff0c;以便将来使用。 跨平台兼容性&#xff1a; 文件是一种通用…...

ubuntu黑屏问题解决

重启Ubuntu后&#xff0c;系统自动进入tty1&#xff0c;无法进入桌面。想到前几天安装了一些主题之类的&#xff0c;然后今天才重启&#xff0c;可能是这些主题造成冲突或者问题了把。 这里直接重新安装ubuntu-desktop解决&#xff1a; 更新源&#xff1a; sudo apt-get upd…...

Java如何实现反转义

Java如何实现反转义 前提 最近做的一个需求&#xff0c;是热搜词增加换一批的功能。功能做完自测后&#xff0c;交给了测试伙伴&#xff0c;但是测试第二天后就提了一个bug&#xff0c;出现了未知词 levis。第一眼看着像公司售卖的一个品牌-李维斯。然后再扒前人写的代码&…...

动态规划(路径问题)

62. 不同路径 62. 不同路径 - 力扣&#xff08;LeetCode&#xff09; 动态规划思想第一步&#xff1a;描述状态~ dp[i][j]&#xff1a;表示走到i&#xff0c;j位置时&#xff0c;一共有多少种方法~ 动态规划思想第二步&#xff1a;状态转移方程~ 动态规划思想第三步&#xf…...

python http调用视觉模型moondream

目录 一、什么是moondream 二、资源地址 三、封装了http进行接口请求 四、代码解析 解释 可能的改进 一、什么是moondream Moondream 是一个针对视觉生成任务的深度学习模型,专注于图像理解和生成,包括图像标注(captioning)、问题回答(Visual Question Answering,…...

Spark Streaming编程基础

文章目录 1. 流式词频统计1.1 Spark Streaming编程步骤1.2 流式词频统计项目1.2.1 创建项目1.2.2 添加项目依赖1.2.3 修改源目录1.2.4 添加scala-sdk库1.2.5 创建日志属性文件 1.3 创建词频统计对象1.4 利用nc发送数据1.5 启动应用&#xff0c;查看结果 2. 编程模型的基本概念3…...

深入 Flutter 和 Compose 的 PlatformView 实现对比,它们是如何接入平台控件

在上一篇《深入 Flutter 和 Compose 在 UI 渲染刷新时 Diff 实现对比》发布之后&#xff0c;收到了大佬的“催稿”&#xff0c;想了解下 Flutter 和 Compose 在 PlatformView 实现上的对比&#xff0c;恰好过去写过不少 Flutter 上对于 PlatformView 的实现&#xff0c;这次恰好…...

C# OpenCV机器视觉:红外体温检测

在一个骄阳似火的夏日&#xff0c;全球却被一场突如其来的疫情阴霾笼罩。阿强所在的小镇&#xff0c;平日里熙熙攘攘的街道变得冷冷清清&#xff0c;人们戴着口罩&#xff0c;行色匆匆&#xff0c;眼神中满是对病毒的恐惧。阿强作为镇上小有名气的科技达人&#xff0c;看着这一…...

FCA-FineDataLink认证

FCA-FineDataLink证书 Part.1&#xff1a;判断题 &#xff08;总分&#xff1a;18分 得分&#xff1a;16&#xff09; 第1题 判断题 数据同步只支持写入到已存在表&#xff0c;不支持自动建表(得分&#xff1a;2分 满分&#xff1a;2分) 正确答案&#xff1a;B 你的答案&…...

第19篇:python高级编程进阶:使用Flask进行Web开发

第19篇&#xff1a;python高级编程进阶&#xff1a;使用Flask进行Web开发 内容简介 在第18篇文章中&#xff0c;我们介绍了Web开发的基础知识&#xff0c;并使用Flask框架构建了一个简单的Web应用。本篇文章将深入探讨Flask的高级功能&#xff0c;涵盖模板引擎&#xff08;Ji…...

js截取video视频某一帧为图片

1.代码如下 <template><div class"box"><div class"video-box"><video controls ref"videoRef" preload"true"src"https://qt-minio.ictshop.com.cn:9000/resource-management/2025/01/08/7b96ac9d957c45a…...

[云讷科技]Kerloud Falcon四旋翼飞车虚拟仿真空间发布

虚拟仿真环境作为一个独立的专有软件包提供给我们的客户&#xff0c;用于帮助用户在实际测试之前验证自身的代码&#xff0c;并通过在仿真引擎中添加新的场景来探索新的飞行驾驶功能。 环境要求 由于环境依赖关系&#xff0c;虚拟仿真只能运行在装有Ubuntu 18.04的Intel-64位…...

Jetson nano 安装 PCL 指南

本指南帮助 ARM64 架构的 Jetson Nano 安装 PCL&#xff08;点云库&#xff09;。 安装步骤 第一步&#xff1a;安装依赖 在终端中运行以下命令&#xff0c;安装 PCL 所需的依赖&#xff1a; sudo apt-get update sudo apt-get install git build-essential linux-libc-dev s…...

go-zero框架基本配置和错误码封装

文章目录 加载配置信息配置 env加载.env文件配置servicecontext 查询数据生成model文件执行查询操作 错误码封装配置拦截器错误码封装 接上一篇&#xff1a;《go-zero框架快速入门》 加载配置信息 配置 env 在项目根目录下新增 .env 文件&#xff0c;可以配置当前读取哪个环…...

Android中Service在新进程中的启动流程2

目录 1、Service在客户端的启动入口 2、Service启动在AMS的处理 3、Service在新进程中的启动 4、Service与AMS的关系再续 上一篇文章中我们了解了Service在新进程中启动的大致流程&#xff0c;同时认识了与客户端进程交互的接口IApplicationThread以及与AMS交互的接口IActi…...

论文速读|Matrix-SSL:Matrix Information Theory for Self-Supervised Learning.ICML24

论文地址&#xff1a;Matrix Information Theory for Self-Supervised Learning 代码地址&#xff1a;https://github.com/yifanzhang-pro/matrix-ssl bib引用&#xff1a; article{zhang2023matrix,title{Matrix Information Theory for Self-Supervised Learning},author{Zh…...

ubunut22.04安装docker(基于阿里云 Docker 镜像源安装 Docker)

安装 更新包管理器&#xff1a; sudo apt update 安装 Docker 的依赖包 sudo apt install apt-transport-https ca-certificates curl gnupg lsb-release添加阿里云 Docker 镜像源 GPG 密钥&#xff1a; curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gp…...

k8s namespace绑定节点

k8s namespace绑定节点 1. apiserver 启用准入控制 PodNodeSelector2. namespace 添加注解 scheduler.alpha.kubernetes.io/node-selector3. label node 1. apiserver 启用准入控制 PodNodeSelector vim /etc/kubernetes/manifests/kube-apiserver.yaml spec:containers:- co…...