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

【C++程序员必修第一课】C++基础课程-14:C++ 函数(上)

1 本课主要内容:

  • 函数是什么?
  • 函数的声明、定义和调用;
  • 函数返回值,函数参数,参数默认值
  • 函数参数不同类型的调用方式:传值、指针、数组、常量引用、引用等

2 主要知识点:

  • 函数是什么?

函数也叫方法,就是把实现特定业务功能的一些代码写到一块,起一个名称(叫函数名),方便调用;函数可以有可选返回值,和 0 到多个的输入参数;

如下例子:

// 函数例子:判断二个数值,并返回其中大的数值
int get_max(int a, int b) {if (a > b) {return a;    }else {return b;    }
}// 调用函数
int v1{0};
int v2{0};
...
int value = get_max(v1, v2);// 以上 get_max 函数也可写成如下格式:
int get_max(int a, int b) {return a > b ? a : b;    // 判断 a > b,true 返回 a;false 返回 b
}
  • 函数声明和实现

函数格式:

return_type function_name(parameter_list);

return_type:返回类型;void没有返回类型

function_name:函数名称

parameter_list:函数参数;支持0到多个参数;留空或者void没有参数;

// 没有返回值,没有参数函数例子:
void do_something(void)
{...
}
// 或者写成
void do_something()
{...
}// 带参数、返回值函数例子:(计算 a 和 b 的和,返回计算结果)
int add_number(int a, int b)
{return a+b;
}
  • 调用函数

// 普通函数
void do_something()
{...
}
// 带参数、返回值函数
int add_number(int a, int b)
{return a+b;       // 返回计算结果
}// 调用普通函数,没有返回值,没有输入参数
do_something();
// 调用带参数、返回值函数
int value = add_number(10, 20);
  • 函数的声明和实现分开写

// 先声明
void do_something(void);// 调用函数
do_something();// 再实现
void do_something(void)
{// ...
}
  • 函数参数默认值

函数参数默认值,就是当调用函数没有给定参数值的时候,使用默认参数值

C++ 支持函数参数默认值

// 带参数默认值函数
void set_visible(const std::string &key, bool visible = true);// 调用函数
set_visible("name");        // visible参数没有填写;默认 visible=true
set_visible("name", true);  // visible=true
set_visible("name", false); // visible=false
  • 函数参数:传递指针

// 指针参数例子1:指向某个类型的指针
void do_something(int * numberPointer, int mul)
{const int a = *numberPointer;std::cout << "number:" << a << std::endl;*numberPointer = a * mul;
}int number = 10;
// 调用函数
do_something(&number, 2);    // &取对象指针
std::cout << "after number:" << number << std::endl;     // 20
  • 函数参数:传递数组

// 也可以写成:void do_something(int size, float numberArray[])
void do_something(int size, float* numberArray)
{for (int i = 0; i < size; i++) {const float v = numberArray[i];std::cout << "numberArray[" << i << "] = " << v << std::endl;}
}float array1[5] = {1.1, 2.2, 3.3, 4.4, 5.5};
// 调用函数
do_something(5, array1);
  • 函数参数:传递复杂数据类型

非内置复杂数据类型(如 std::string, struct结构,class类对象等),强烈建议使用常量引用传递参数,可以避免参数实体拷贝临时变量

// (推荐)常量引用,参数变量 name 和调用函数是同一个地址
void do_something1(const std::string& name)
{std::cout << "input name:" << name << std::endl;
}
// (不推荐写法)非常量引用,调用时会拷贝临时参数,参数变量 name 和调用函数参数不是同一个地址;
void do_something2(std::string name)
{std::cout << "input name:" << name << std::endl;
}std::string name("Hello World!");
do_something1(name);
do_something2(name);
  • 函数参数:传递引用

一般引用是用于数据输出

// 传递引用参数
bool do_something3(std::string& inOutName)
{std::cout << "input name : " << inOutName << std::endl;inOutName = "2222";// 输出数据return true;
}std::string name("1111");
do_something3(name);    // 调用后输出'2222'
std::cout << "output name : " << name << std::endl;

3 注意事项:

  • 函数返回值,需要注意避免返回指向局部变量的引用数据
// **** 以下是错误演示代码,不能返回指向局部变量的引用
const std::string & get_file_name(const std::string& filePath) {std::string fileName(filePath);// ... return fileNme
}

4 课后练习:

  • (修改上一节课后练习作业)新建一个控制台程序,利用 while 指令循环提示用户输入指令,分别使用不同函数,实现一个命令行用户管理系统,具体指令功能如下:
  • "add" : 新建一个用户,需要提示用户输入用户名称;
  • "delete" : 删除最后一个用户
  • "list" : 列出所有用户名称
  • "quit" : 退出程序

 附录:在线视频课程

【C++程序员必修第一课】C++基础课程

相关文章:

【C++程序员必修第一课】C++基础课程-14:C++ 函数(上)

1 本课主要内容&#xff1a; 函数是什么&#xff1f;函数的声明、定义和调用&#xff1b;函数返回值&#xff0c;函数参数&#xff0c;参数默认值函数参数不同类型的调用方式&#xff1a;传值、指针、数组、常量引用、引用等 2 主要知识点&#xff1a; 函数是什么&#xff1f; …...

android studio打开flutter项目报红

一、android studio打开flutter项目报红&#xff0c;如下图&#xff1a; 二、解决方法&#xff1a; 2.1 在这个build.gradle添加以下代码&#xff0c;如图&#xff1a; 2.2 在build.gradle最顶部添加如下代码&#xff1a; def localProperties new Properties() def localPr…...

julia笔记:字符和字符串

1 字符 Char类型的值代表单个字符 ca #a: ASCII/Unicode U0061 (category Ll: Letter, lowercase)typeof(c) #Char 将 Char 转换为其对应的整数值&#xff0c;即 Unicode 代码 cInt(c) c #97typeof(c) #Int64 将一个整数值&#xff08;Unicaode&#xff09;转回 Char Cha…...

组合数(递推版)的初始化

初始考虑为将第一列数和斜对角线上的数进行初始化。 橙色方块由两个绿色方块相加而来&#xff0c;一个为1&#xff0c;一个为0&#xff0c;所以斜对角线都为1&#xff0c;可以通过计算得来&#xff0c;不需要初始化&#xff0c;需要与码蹄集盒子与球 第二类Stirling数&#xf…...

Apache JMeter 安装教程

下载&#xff1a; 注意事项&#xff1a;使用JMeter前需要配置JDK环境 下载地址 下载安装以后&#xff0c;打开安装的bin目录 D:\software\apache-jmeter-5.4.1\apache-jmeter-5.4.1\bin&#xff0c;找到jmeter.bat&#xff0c;双击打开 打开后的样子 语言设置&#xff1a; 1…...

【unity小技巧】实现无限滚动视图和类似CSGO的开箱抽奖功能及Content Size Fitter组件的使用介绍

文章目录 一篇一句前言素材一、无限滚动视图1. 绘制视图2. Content Size Fitter是布局控件&#xff08;1&#xff09;在文本框中使用&#xff08;2&#xff09;控制Scroll View(Scroll Rect组件)控件下Content的大小 3. 控制视图无限滚动4. 向右拉无限滚动5. 修复滚动视图一卡一…...

Mybatis的SqlRunner执行流程

Mybatis的SqlRunner执行流程 SqlRunner exec new SqlRunner(connection); Map<String, Object> row exec.selectOne("SELECT * FROM PRODUCT WHERE PRODUCTID ?", "FI-SW-01");connection.close();assertEquals("FI-SW-01", row.ge…...

Zookeeper、Kafka集群与Filebeat+Kafka+ELK架构、部署实例

Zookeeper、Kafka集群与FilebeatKafkaELK架构、部署实例 一、Zookeeper1.1、Zookeeper 定义1.2、Zookeeper 工作机制1.3、Zookeeper 特点1.4、Zookeeper 数据结构1.5、Zookeeper 应用场景1.5、Zookeeper 选举机制1.5.1、 第一次启动选举机制1.5.2、 非第一次启动选举机制 二、Z…...

leetcode做题笔记198. 打家劫舍

你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警。 给定一个代表每个房屋存放金额的…...

【编解码格式】DV

DV DV是指用于存储数位影片&#xff08;英语&#xff1a;Digital video&#xff09;的一种编解码器和录像带格式系列&#xff0c;由索尼和松下为首的摄像机制造商联盟于1995年推出。20世纪90年代末和21世纪初&#xff0c;DV与从模拟到数字的桌面式视频制作的过渡密切相关&…...

Flink之常用处理函数

常用处理函数 处理函数概述 基本处理函数ProcessFunction介绍使用示例 按键分区处理函数KeyedProcessFunction介绍定时器Timer和定时服务TimerService使用示例其他 窗口处理函数ProcessWindowFunction介绍ProcessAllWindowFunction介绍使用示例 流的合并处理函数CoProcessFunct…...

【C语言】善于利用指针(三)

&#x1f497;个人主页&#x1f497; ⭐个人专栏——C语言初步学习⭐ &#x1f4ab;点击关注&#x1f929;一起学习C语言&#x1f4af;&#x1f4ab; 目录 导读&#xff1a;1. 函数指针1.1 什么使函数指针1.2 用函数指针变量调用函数 2. 返回指针值的函数3. 函数指针数组3.1 实…...

ant design vue Message 用法以及内容为 html片段情况

ant design vue 的 Message 用法 全局展示操作反馈信息 何时使用 # 可提供成功、警告和错误等反馈信息。顶部居中显示并自动消失&#xff0c;是一种不打断用户操作的轻量级提示方式。 全局配置&#xff1a; // main.ts// 进行全局配置 message.config({top: 0.7rem,//高度…...

HotSpot算法细节实现——安全点

OopMap 垃圾回收时&#xff0c;如何找到垃圾&#xff1f; 在可达性分析算法中从GC Roots集合找引用链分析对象是否可达。 固定可作为GC Roots的节点主要在全局性的引用&#xff08;例如常量或类静态属性&#xff09;与执行上下文&#xff08;例如栈帧中的本地变量表&#xf…...

杂谈:DC对Verilog和SystemVerilog语言的支持

DC对Verilog和SystemVerilog语言的支持 设计语言用哪种&#xff1f;Design Compiler对二者的支持简单的fsm电路测试测试结果对比写在最后 设计语言用哪种&#xff1f; 直接抛出结论&#xff1a;先有电路&#xff0c;后为描述。设计端而言&#xff0c;没有语言的高低好坏&#…...

网络安全评估(网络安全评估)

讨论了基于互联网的网络安全评估和渗透测试的基本原理&#xff0c;网络安全服务人员&#xff0c;安全运营人员&#xff0c;通过评估来识别网络中潜在的风险&#xff0c;并对其进行分类分级。 黑客通常采取的攻击方式如下&#xff1a; 突破目标外围系统&#xff0c;比如主站拿…...

offsetof宏计算某变量相对于首地址的偏移量

宏&#xff1a;offsetof的使用 //offsetof (type,member) //type是结构体的类型名&#xff0c;member是结构体中的成员名。struct Student {char name[5]; // 姓名int age; // 年龄float score; // 成绩 };int main() {struct Student s;printf("%zd\n", off…...

算法|每日一题|统计无向图中无法互相到达点对数|并查集

2316. 统计无向图中无法互相到达点对数 原题地址&#xff1a; 力扣每日一题&#xff1a;统计无向图中无法互相到达点对数 给你一个整数 n &#xff0c;表示一张 无向图 中有 n 个节点&#xff0c;编号为 0 到 n - 1 。同时给你一个二维整数数组 edges &#xff0c;其中 edges[i…...

浏览器的四种缓存协议

❤️浏览器缓存 在HTTP里所谓的缓存本质上只是浏览器和业务侧根据不同的报文字段做出不同的缓存动作而已 四种缓存协议如下 Cache-ControlExpiresETag/If-None-MatchLast-Modified/If-Modified-Since &#x1f3a1;Cache-Control 通过响应头设置Cache-Control和max-age&…...

力扣每日一题55:跳跃游戏

题目描述&#xff1a; 给你一个非负整数数组 nums &#xff0c;你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标&#xff0c;如果可以&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 …...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

SCAU期末笔记 - 数据分析与数据挖掘题库解析

这门怎么题库答案不全啊日 来简单学一下子来 一、选择题&#xff08;可多选&#xff09; 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘&#xff1a;专注于发现数据中…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat&#xff08;I/O Statistics&#xff09;是Linux系统下用于监视系统输入输出设备和CPU使…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版

1.题目描述 2.思路 当前的元素可以重复使用。 &#xff08;1&#xff09;确定回溯算法函数的参数和返回值&#xff08;一般是void类型&#xff09; &#xff08;2&#xff09;因为是用递归实现的&#xff0c;所以我们要确定终止条件 &#xff08;3&#xff09;单层搜索逻辑 二…...