C++ 入门03:函数与作用域

往期回顾:

C++ 入门01:初识 C++-CSDN博客
C++ 入门02:控制结构和循环-CSDN博客


一、前言

在前面的文章学习中,我们了解了C++语言的基础,包括如何定义变量来存储数据,以及如何利用输入输出流实现程序与用户之间的无缝交互。此外,还掌握了控制结构——条件语句与循环结构。

而今天的学习内容则是C++中的函数与作用域。这部分内容是编写模块化代码和管理变量范围的关键。函数,作为任何一门编程的基石之一,它允许我们将代码分割成可重用的独立块,每个块都执行特定的任务。这种模块化编程的思想极大地提高了代码的可读性、可维护性和复用性。通过学习函数,我们将学会如何定义自己的函数来封装特定的功能,并通过参数传递和返回值机制来实现函数间的数据交换。

而作用域则定义了变量、函数等标识符在程序中可见和可访问的区域。理解作用域不仅有助于我们更好地管理变量的生命周期和访问权限,还能避免命名冲突等常见问题。在C++中,作用域可以细分为全局作用域、局部作用域、块作用域以及函数原型作用域等,每种作用域都有其特定的规则和用途。

二、函数与作用域

 2.1、 函数

函数是执行特定任务或操作的独立代码块。这种模块化设计极大地促进了代码的组织、重用和维护,一个典型的 C++ 函数包括函数声明和函数定义。

(1)函数声明

函数声明(也称为函数原型)为编译器提供了函数的基本信息,包括函数的返回类型、名称以及它接受的参数类型和数量。函数声明通常放在头文件中(.h或.hpp文件),或者在源文件的开始部分,以便在调用函数之前让编译器知道该函数的存在和如何调用它。

示例:

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

 这个声明表明add是一个函数,它接受两个整型参数(ab),并返回一个整型值。

(2)函数定义

函数定义提供了函数的实际实现,即函数体中的代码,这些代码定义了函数如何执行其任务。函数定义必须包含函数的所有部分:返回类型、函数名、参数列表(包括参数的类型和名称)以及函数体(即大括号{}内的代码)。

示例:

// 函数定义示例  
int add(int a, int b) {  return a + b;  
}

在这个例子中,add函数的定义包含了其完整的实现:它简单地将两个整数参数相加,并返回它们的和。 

(3) 函数参数

函数可以接受参数,这些参数在调用时传递给函数。

示例:

void printMessage(std::string message) {std::cout << message << std::endl;
}int main() {printMessage("Hello, World!");return 0;
}

(4)函数返回值

函数可以返回一个值。返回值的类型由函数的返回类型决定。

示例:

double multiply(double a, double b) {return a * b;
}int main() {double result = multiply(2.5, 4.0);std::cout << "Result: " << result << std::endl;return 0;
}

(5)函数调用

一旦函数被声明和定义,它就可以在程序的其他部分被调用了。调用函数时,需要提供与函数声明中指定的数量和类型相匹配的参数。

示例:

#include <iostream>  // 函数声明  
int add(int a, int b);  int main() {  // 调用函数  int sum = add(5, 3);  std::cout << "Sum: " << sum << std::endl; // 输出:Sum: 8  return 0;  
}  // 函数定义  
int add(int a, int b) {  return a + b;  
}

在这个例子中,main函数调用了add函数,并传递了两个整数(5和3)作为参数。add函数计算这两个数的和,并通过return语句将其返回给调用者(在这里是main函数)。然后,main函数将返回的值存储在变量sum中,并将其打印到控制台。  

2.2、 作用域

作用域是变量在程序中的可见性范围。C++ 中有四种主要的作用域:局部作用域、全局作用域、类作用域和命名空间作用域。这些作用域共同构成了C++程序中标识符的可见性和生命周期的框架。理解这些作用域对于编写清晰、可维护的C++代码至关重要。

(1)局部作用域

局部作用域是变量在其被声明的代码块(如函数体、循环体、条件语句块等)内有效的区域。一旦离开这个代码块,该变量就不再可见,其占用的内存也会被释放(对于自动存储期的变量而言)。局部变量通常用于存储临时的、仅在特定函数或代码块内需要的数据。

示例:

void myFunction() {  int localVar = 10; // localVar 在 myFunction 的局部作用域内有效  // ...  
} // localVar 在这里失去作用域

(2)全局作用域

全局作用域是变量在程序的所有部分都可见的区域,但通常是在所有函数之外声明的。全局变量在整个程序运行期间都保持其值,直到程序结束。然而,过度使用全局变量通常被认为是不好的编程实践,因为它们可能导致代码难以理解和维护,以及引入难以发现的bug。

示例:

int globalVar = 20; // globalVar 在全局作用域内有效  void anotherFunction() {  // 在这里可以访问 globalVar  
}

(3)类作用域

类作用域是面向对象编程中的一个重要概念,它定义了类成员(包括变量和函数)的可见性和访问权限。类成员变量(也称为属性或字段)和成员函数(也称为方法)在类的定义内部声明,并只能通过类的对象或指针来访问(除非它们是静态成员)。类作用域有助于封装数据,即将数据和相关操作组合在一起,形成一个独立的实体。

示例:

class MyClass {  
public:  int classVar; // classVar 在 MyClass 的类作用域内有效  void myMethod() {  // 在这里可以访问 classVar  }  
};

(4)命名空间作用域

命名空间作用域是C++中用于解决命名冲突的一种机制。它允许你将一组相关的标识符(如变量名、函数名等)封装在一个命名空间中,从而避免与其他命名空间中的标识符发生冲突。使用命名空间可以提高代码的组织性和可读性,同时减少命名冲突的可能性。

示例:

namespace MyNamespace {  int namespaceVar = 30; // namespaceVar 在 MyNamespace 的命名空间作用域内有效  void myNamespaceFunction() {  // ...  }  
}  // 访问命名空间中的成员需要使用作用域解析运算符 ::  
int main() {  int x = MyNamespace::namespaceVar;  MyNamespace::myNamespaceFunction();  return 0;  
}

以上就是 C++ 中函数与作用域的基本用法的知识点了。函数帮助我们组织和重用代码,而理解作用域有助于我们管理变量的可见性和生命周期。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

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

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

相关文章

华为机考真题 -- 找朋友

题目描述: 在学校中,N 个小朋友站成一队, 第 i 个小朋友的身高为 height[i],第 i 个小朋友可以看到的第一个比自己身高更高的小朋友 j,那么 j 是 i 的好朋友(要求 j >i)。请重新生成一个列表,对应位置的输出是每个小朋友的好朋友位置,如果没有看到好朋友,请在该位置…

微软清华提出全新预训练范式,指令预训练让8B模型实力暴涨!实力碾压70B模型

现在的大模型训练通常会包括两个阶段&#xff1a; 一是无监督的预训练&#xff0c;即通过因果语言建模预测下一个token生成的概率。该方法无需标注数据&#xff0c;这意味着可以利用大规模的数据学习到语言的通用特征和模式。 二是指令微调&#xff0c;即通过自然语言指令构建…

Python面试题:请解释什么是鸭子类型(duck typing)?

鸭子类型&#xff08;Duck Typing&#xff09;是一种动态类型语言中的概念&#xff0c;它基于对象的行为&#xff08;方法和属性&#xff09;而不是其实际类型进行判断。这个概念源自詹姆斯惠特科姆赖利的谚语&#xff1a; “如果它走起来像鸭子&#xff0c;叫起来像鸭子&#…

通过高德地图 JS API实现单击鼠标进行标注

效果图: 核心代码: <template><a-modal title="选择地图所在位置" :width="width" :visible="visible" @ok="handleOk" @cancel="handleCancel" cancelText="关闭"><div class="location-…

场外期权有交割日吗?场外期权应该怎么交割?

今天带你了解场外期权有交割日吗&#xff1f;场外期权应该怎么交割&#xff1f;场外个股期权是一种非标准化的金融衍生品&#xff0c;它允许投资者在未来某一特定日期以特定价格买入或卖出某一特定股票。 交割日就是买卖双方进行交割的日期,期权合约具有到期日,到期日的后一天…

WEB安全-文件上传漏洞

1 需求 2 接口 3 MIME类型 在Web开发中&#xff0c;MIME&#xff08;Multipurpose Internet Mail Extensions&#xff09;类型用于标识和表示文档的格式。这些类型在HTTP请求和响应头中扮演着重要的角色&#xff0c;告诉浏览器如何解释和处理接收到的资源12。 以下是一些Web开发…

ChatGPT:Java Stream 的疑问

ChatGPT&#xff1a;Java Stream 的疑问 解释一下 List<SupplierVm> collect tSupplierPage.getRecords().stream().map(item ->{SupplierVm supplierVm new SupplierVm();BeanUtils.copyProperties(item, supplierVm);return supplierVm;}).collect(Collectors.to…

【JavaScript】具有 iterable 接口的数据结构

具有 iterable 接口的数据结构指的是可以通过迭代器&#xff08;Iterator&#xff09;访问其成员的数据结构。在 JavaScript 中&#xff0c;具有 iterable 接口的数据结构包括数组&#xff08;Array&#xff09;、字符串&#xff08;String&#xff09;、Set、Map 等。这些数据…

C电池 和 D 电池的作用和类型详解及其之间的区别

C 和 D 电池是我们日常生活中必不可少的部件。它们通常用于高功率设备。例如手电筒和玩具。 D 型电池和 C 型电池是两种常见的电池类型。它们是一次性圆柱形电池。您可以在很多设备上使用它们。虽然它们有很多相似之处&#xff0c;但它们也有不同的特点。这些特点使它们适合某…

如何用qq邮箱注册outlook邮箱

&#x1f4d1;打牌 &#xff1a; da pai ge的个人主页 &#x1f324;️个人专栏 &#xff1a; da pai ge的博客专栏 ☁️宝剑锋从磨砺出&#xff0c;梅花香自苦寒来 ​ 目录 第一步输入qq邮箱 第二步…

数据类型及数据块认知

西门子STEP7编程语言 梯形图(LAD) 功能块图(FBD) 语句表(STL) 其中梯形图和功能块图可以相互转换 CPU常用数据区 信号输入区 I 信号输出区 Q 程序中表现形式&#xff0c;IX.X/QX.X;IWX/QWX-访问的是CPU输出输入过程映像区 另一种形式IWX:P/QWX:P-访问的是信号端口地址&#xf…

深度整合全球资源,分贝通打造高效、合规的海外差旅管理平台

在全球化商业活动的背景下,中国企业出海已成为常态。然而,随着海外差旅市场的全面增长,企业在海外支出管理上面临诸多挑战。据2023年数据显示,分贝通出海差旅业务GMV同比增长高达500倍,这一增长背后隐藏着企业对于更省钱、更高效管控方式的迫切需求。 面对与日俱增的开支,企业开…

js对象的方法速览---数组的静态方法,实例方法和属性合集,各包含一个示例

tip&#xff1a; 本文仅作为查找和基本使用的展示&#xff0c;需要深入了解这些方法的使用请参考&#xff1a;Object - JavaScript | MDN (mozilla.org) 可以通过目录快速锁定需要查找的方法和查看它的使用 目录 tip&#xff1a; 新建一个对象 实例属性 实例方法 hasOwn…

Websocket 替代方案:如何使用 Firestore 监听实时事件

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 ​在现代 Web 开发中,实时更新功能对于许多应用程序(如聊天应用、协作工具和在线游戏)都是必不可少的。虽然 WebSocket 是一种常用的实时通信技术,但 Google 的 Firestore 也提供了一种强大的替代方案,使得实时监听变得…

Golang中defer和return顺序

在Golang中&#xff0c;defer 和 return 的执行顺序是一个重要的特性&#xff0c;它们的执行顺序如下&#xff1a; return语句不是一条单独的语句&#xff0c;实际上&#xff0c;它是由赋值和返回两部分组成的。赋值步骤会先执行&#xff0c;这一步会计算return语句中的表达式…

Linux安装Docker以及Docker Componse

一、安装前准备工作 1.1 查看服务器系统版本以及内核版本 cat /etc/redhat-release 1.2 查看服务器内核版本 uname -r这里我们使用的是CentOS 7.4 系统&#xff0c;内核版本为3.10 1.3 安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm21.4 设置…

赛氪网受邀出席浙江省应用数学研究会,共启数学教育与竞赛新篇章

2024年7月5日&#xff0c;浙江省应用数学研究会在风景如画的嘉兴市成功举办了2024年学术研讨会暨第七届第六次理事会工作会议的首日活动。作为技术支持单位&#xff0c;赛氪网受邀参与此次盛会&#xff0c;彰显了其在数学教育及竞赛领域的深厚实力与积极贡献。 开幕式由嘉兴大学…

linux watchdog 子系统

目录 一、watchdog 子系统二、关键数据结构2.1 watchdog_device2.2 watchdog_ops2.3 watchdog_info 三、重要流程3.1 watchdog 初始化3.2 watchdog 设备注册3.3 watchdog 设备文件操作函数3.4 watchdog 喂狗用户空间 watchdog&#xff08;busybox&#xff09;内核空间喂狗疑问 …

生成随机密码

生成8位无重复的密码&#xff08;可以包含数字、大小写字母&#xff09; import random import string character string.digits string.ascii_letters password .join(random.sample(character, 8)) print(f"生成的随机密码为:{password}")

rushAWD使用说明

rushAWD使用说明 检查单 先开个坑&#xff0c;慢慢填 检查单 af 配置项用途值conf.yaml总配置项靶机名:靶机IP