C++ 入门(三)— 函数

news2024/11/15 5:47:19

文章目录

  • 函数简介
  • 函数返回值
  • Void 函数(非值返回函数)
  • 函数参数和参数
  • 局部范围
  • 函数的声明和定义
  • 具有多个代码文件的程序

函数简介

C++ 程序的方式工作。当程序遇到函数调用时,它将在一个函数内按顺序执行语句。函数调用是告诉 CPU 中断当前函数并执行另一个函数的表达式。CPU 在当前执行点“放置一个标记”,然后调用(执行)函数调用中指定的函数。当调用的函数结束时,CPU 将返回到它添加标记的点,并继续执行。

下面是一个示例程序,演示如何定义和调用新函数:

#include <iostream>

void doPrint() // 函数定义
{
    std::cout << "In doPrint()" << std::endl;
}

int main()
{
    std::cout << "Starting main()" << std::endl;
    doPrint(); // 函数调用
    doPrint(); // 函数调用
    std::cout << "Ending main()" << std::endl;
    return 0;
} 

请添加图片描述

C++ 中不支持嵌套函数

函数返回值

编写用户定义的函数时,可以确定函数是否会将值返回给调用方。若要将值返回给调用方,需要满足以下两项要求。

首先,函数必须指示将返回的值类型。这是通过设置函数的返回类型来完成的,该类型是在函数名称之前定义的类型。

其次,在将返回值的函数中,我们使用 return 语句来指示返回给调用方的特定值。从函数返回的特定值称为返回值。执行 return 语句时,函数立即退出,并将返回值从函数复制回调用方。此过程称为按值返回。

#include <iostream>

int getValueFromUser()//获取用户输入的值
{
  std::cout << "Enter an integer: ";
 int input{};
 std::cin >> input;
 return input; // 返回 input 的值
}

int main()
{
 int num { getValueFromUser() };//使用getValueFromUser()的返回值初始化num
 std::cout << num << " doubled is: " << num * 2 << '\n';
 return 0;
}

请添加图片描述

C++标准仅定义了 3 个状态代码的含义:0、EXIT_SUCCESS 和 EXIT_FAILURE。0 和 EXIT_SUCCESS 都表示程序已成功执行。EXIT_FAILURE表示程序未成功执行。

如果未提供 return 语句,函数 main 将隐式返回 0。

Void 函数(非值返回函数)

Void 返回值

函数不需要将值返回给调用方。为了告诉编译器函数不返回值,请使用返回类型 void。

注意事项:

  • void 函数不需要 return 语句;
  • Void 函数不能用于需要值的表达式;
  • 从 void 函数返回值是编译错误;

函数参数和参数

函数参数是函数标头中使用的变量。函数参数的工作方式与函数内部定义的变量几乎相同,但有一个区别:它们使用函数调用者提供的值进行初始化。

函数参数在函数标头中定义,方法是将它们放在函数名称后面的括号之间,多个参数用逗号分隔。

void doPrint()
{
    std::cout << "In doPrint()\n";
}

void printValue(int x)
{
    std::cout << x  << '\n';
}
int add(int x, int y)
{
    return x + y;
}

局部范围

局部变量
在函数主体内定义的变量称为局部变量。

int add(int x, int y)
{
    int z{ x + y }; // z 是一个局部变量

    return z;
}

局部变量生命周期
大多数情况下,局部变量是在输入函数时创建的,并在退出函数时以相反的创建顺序销毁。

int add(int x, int y)
{
    int z{ x + y };

    return z;
} // z, y, x 在这时销毁

临时对象
临时对象(有时也称为匿名对象)是由编译器创建的用于临时存储值的未命名对象。

#include <iostream>

int getValueFromUser()
{
  std::cout << "Enter an integer: ";
 int input{};
 std::cin >> input;

 return input; // 将输入的值返回给调用者
}

int main()
{
 std::cout << getValueFromUser() << '\n'; 

 return 0;
}

在上面的程序中,该函数将存储在局部变量中的值返回给调用者。由于将在函数结束时销毁,因此调用方将收到该值的副本,以便它具有即使在销毁后也可以使用的值。

函数的声明和定义

正向声明允许我们在实际定义标识符之前告诉编译器标识符的存在。

对于函数,这允许我们在定义函数的主体之前告诉编译器函数的存在。这样,当编译器遇到对函数的调用时,它会理解我们正在进行函数调用,并可以检查以确保我们正确调用函数,即使它还不知道函数的定义方式或位置。

要为函数编写正向声明,我们使用函数声明语句(也称为函数原型)。函数声明由函数的返回类型、名称和参数类型组成,以分号结尾。可以选择包含参数的名称。函数体不包含在声明中。

在 C++ 中,所有定义都是声明。因此,它既是一个定义,也是一个声明。int x;

相反,并非所有声明都是定义。不是定义的声明称为纯声明。纯声明的类型包括函数、变量和类型的正向声明。

#include <iostream>

int add(int x, int y); // add()的前向声明(使用函数声明)

int main()
{
    std::cout << "The sum of 3 and 4 is: " << add(3, 4) << '\n'; 
    return 0;
}

int add(int x, int y) // 主体直到这里才定义
{
    return x + y;
}

具有多个代码文件的程序

对于 VS Code 用户

若要创建新文件,请从顶部导航栏中选择“查看>资源管理器”以打开“资源管理器”窗格,然后单击项目名称右侧的“新建文件”图标。或者,从顶部导航栏中选择“文件”>“新建文件”。然后为您的新文件命名(不要忘记 .cpp 扩展名)。如果文件显示在 .vscode 文件夹中,请将其向上拖动一级到项目文件夹。

接下来打开tasks.json文件,找到 .“${file}”,

您在这里有两个选择:

如果您希望明确要编译哪些文件,请替换为要编译的每个文件的名称,每行一个,如下所示:“${file}”, “main.cpp”,
“add.cpp”,

读取器“geo”报告,你可以让 VS Code 通过替换为 (在 Windows 上) 来自动编译目录中的所有 .cpp
文件。“ f i l e " , " {file}"," file","{fileDirname}\.cpp" Reader “Orb” 报告适用于
Unix。"${fileDirname}/
.cpp”

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

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

相关文章

责任链模式在java中的实现

1 总览 2 概念 避免请求发送者与接收者耦合在一起&#xff0c;让多个对象都有可能接收请求&#xff0c;将这些对象连接成一条链&#xff0c;并且沿着这条链传递请求&#xff0c;直到有对象处理它为止。职责链模式是一种对象行为型模式。 3 实现 公共部分&#xff0c;一个系…

法大大入选2023德勤“中国明日之星”

1月30日&#xff0c;德勤审计及鉴定合伙人、华南区上市业务合伙人、资本市场服务部王杰森莅临法大大总部&#xff0c;为法大大颁发“2023德勤中国 高科技高成长 明日之星”奖杯&#xff0c;法大大联合创始人兼首席法务官梅臻代表领奖。 &#xff08;左为王杰森&#xff0c;右为…

海外代理IP推荐:5大最佳Luminati替代方案

在跨境出海业务中&#xff0c;海外代理IP是非常高效的助力工具&#xff0c;因此也衍生了非常多的代理服务商。想必大多数都知道Brightdata&#xff08;原名Luminati&#xff09;&#xff0c;但是&#xff0c;由于代理IP的高需求&#xff0c;慢慢地我们发现除了高价的卢米&#…

Prometheus的promQL语法

时间序列 node_cpu_guest_seconds_total{cpu"0"} #{}外的是监控项(指标数据) #{}内的是标签 #node使用cpu的描述统计&#xff0c;符合标签cpu0的时间序列&#xff0c;查询出的结果 #指标项标签就是Prometheus的时间序列_address_ #双下划线标签是Prometheus系统的默…

【小白学unity记录】使用unity播放声音

1. 示例 unity中播放声音涉及到两个组件。AudioSource和AudioClip。AudioSource可以理解为播放器&#xff0c;AudioClip可以理解为音频片段文件。AudioSource可以通过.clip属性切换音频片段。 using UnityEngine;public class PlayerController : MonoBehaviour {private int…

1.迭代与递归 - JS

迭代与递归是函数进阶的第一个门槛。迭代就是对已知变量反复赋值变换&#xff1b;递归就是函数体内调用自身。 迭代 一个迭代是就是一个循环&#xff0c;根据迭代式对变量反复赋值。 求近似根&#xff08;切线法&#xff09;&#xff1b; 迭代描述&#xff1a; x 0 x_0 x0…

安装并开始设置 Windows 终端(命令提示符或Windows PowerShell或Azure Cloud Shell)

安装 安装 若要试用最新的预览功能&#xff0c;可能还需要安装 Windows 终端预览。 ‼️备注 如果你无法访问 Microsoft Store&#xff0c;GitHub 发布页上发布有内部版本。 如果从 GitHub 安装&#xff0c;Windows 终端将不会自动更新为新版本。 有关使用包管理器&#xff…

品牌如何持续发展,重点在于把握消费动机

发展周期较短的品牌可能有很多原因&#xff0c;但是长效发展的品牌却有相似的共性。所有能长效发展的品牌&#xff0c;都牢牢把握住了顾客的消费动机&#xff0c;人们会因为很多原因去消费&#xff0c;这在营销界就被称为“消费动机”&#xff0c;有的消费动机是短暂的&#xf…

MySQL中的数据类型(五)

MySQL中的数据类型&#xff08;五&#xff09; 一、整数类型 数值类型中的长度 m 是指显示长度&#xff0c;并不表示存储长度&#xff0c;只有字段指定 zerofill 时有用 例如&#xff1a; int(3) &#xff0c;如果实际值是 2 &#xff0c;如果列指定了 zerofill &#xff0c;…

【UE 材质】球形遮罩材质

效果 步骤 1. 新建一个材质&#xff0c;这里命名为“M_Mask” 打开“M_Mask”&#xff0c;混合模式设置为已遮罩&#xff0c;勾选双面显示 在材质图表中添加如下节点 此时我们将一个物体赋予材质“M_Mask”并放置在世界坐标原点&#xff0c;可以看到如下效果 2. 如果我们希望能…

C++ 类与对象(中)

本节目标 1. 类的6个默认成员函数 2. 构造函数 3. 析构函数 4. 拷贝构造函数 1.类的6个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。 空类中真的什么都没有吗&#xff1f;并不是&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认…

【golang】13、viper 配置库 | 配置文件读写 | 使用方式 | 源码逻辑分析

文章目录 一、使用方式1.1 特性1.2 优势1.3 设置1.3.1 默认值1.3.2 配置文件1.3.3 写配置文件1.3.4 监听配置文件变化1.3.5 从 io.Reader 读配置1.3.6 Setting Overrides1.3.7 使用 Alias1.3.8 环境变量1.3.9 命令行 Flags1.3.8.1 Flag 接口 1.3.9 配置中心1.3.9.1 未加密1.3.9…

RabbitMQ(一):最新版rabbitmq安装

目录 1 简介1.1特性及好处 2 安装2.1 Ubuntu22.04 apt安装最新rabbitmq1、一键部署2、验证3、RabbitMQWeb管理界面及授权操作4、添加远程用户5、一些常用命令 2.2 Docker安装RabbitMQ - Ubuntu22.041、安装docker2、启动rabbitmq 1 简介 RabbitMQ是一个开源的遵循AMQP协议实现…

多模态大模型综述整理

论文&#xff1a;MM-LLMs: Recent Advances in MultiModal Large Language Models 论文地址&#xff1a; https://arxiv.org/pdf/2401.13601.pdf 表1&#xff1a;26种主流多模态大型语言模型&#xff08;MM-LLMs&#xff09;概要 输入到输出模态&#xff08;I→O&#xff09;…

Sentinel 知识总结

Sentinel 知识总结 Sentinel 是阿里巴巴开源的一个轻量级流量控制框架&#xff0c;主要用于保护系统稳定性和流畅性。它提供了多种流量控制策略&#xff0c;包括QPS限流、并发数限流、线程池限流等&#xff0c;并且支持集群限流。此外&#xff0c;Sentinel还提供了熔断降级、系…

机器学习 | 掌握线性回归的实战技巧

目录 初识线性回归 损失和优化 欠拟合与过拟合 正则化线性模型 模型的保存与加载 初识线性回归 线性回归(Linearregression)是利用回归方程(函数)对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式。特点是&#xff1a;有一个自变量的情况称为单…

Linux实验记录:使用firewalld

前言&#xff1a; 本文是一篇关于Linux系统初学者的实验记录。 参考书籍&#xff1a;《Linux就该这么学》 实验环境&#xff1a; VmwareWorkStation 17——虚拟机软件 RedHatEnterpriseLinux[RHEL]8——红帽操作系统 备注: RHEL8系统中集成了多款防火墙管理工具&#xf…

【百度Apollo】循迹自动驾驶:探索基于视觉感知的路径规划与控制技术

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

牛啊!能透视大模型内部结构的可视化工具!

哈喽&#xff0c;大家好。 今天给大家分享一个非常牛逼的可视化工具&#xff0c;可以清晰了解 GPT 大模型内部的结构。 哦&#xff0c;对了&#xff01;给大家准备了国内用的 ChatGPT key&#xff0c;见评论区。 这个工具可以支持查看 GPT2 和 GPT3 的网络架构。 但能进行交互…

区间时间检索

参数形式 sql <if test"params.beginOrderDate ! null and params.beginOrderDate ! "><!-- 开始时间检索 -->AND DATEDIFF(day,#{params.beginOrderDate},b.order_date) > 0</if><if test"params.endOrderDate ! null and params.endO…