【C++】作用域与函数重载

news2025/1/11 23:53:28

【C++】作用域与函数重载

1、作用域

1.1 作用域的作用

作用域——scope

通常来说,一段程序代码中所用到的名字并不总是有效/可用的,而限定这个名字的可用性的代码范围就是这个名字的作用域。

简单来说,作用域的使用减少了代码中名字的重复冲突,增强了程序的逻辑性与可靠性

1.2 作用域的分类

C++变量根据定义位置的不同,具有不同的作用域:

  • 全局作用域
  • 局部作用域
  • 文件作用域

全局变量具有全局作用域

全局变量只需在一个源文件中定义,就可以作用于所有的源文件

其他不包括全局变量定义的源文件需要用extern关键字再次声明这个全局变量

静态局部变量具有局部作用域。它只被初始化一次,从第一次初始化直到程序运行结束都一直存在,他和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见

局部变量也只有局部作用域,他是自动对象,他在程序运行期间不是一直存在,而是只在函数执行期间存在,函数的一次调用结束后,变量就被撤销,其所占用的内存也被收回

静态全局变量也具有全局作用域,他与全局变量的区别在于如果程序包含多个文件的话,他作用于定义它的文件里,不能作用到其他文件里,即被static关

键字修饰过的变量具有文件作用域。这样即使两个不同的源文件都定义了相同的静态全局变量,也是不同的变量

1.3 static 、const

1.3.1 static

静态函数只能被所在的cpp文件调用,不同cpp文件可以有相同的静态函数名字。

静态函数与普通函数作用域不同,仅在本文件。内部函数:只在当前源文件中声明和定义的函数称为内部函数(static);对于可在当前源文件以外使用的

函数,应该在头文件中说明,或者进行extern全局声明。static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝

static作用于局部变量时

在局部变量声明前加static = 静态局部变量,存储方式改变了

局部变量是动态存储,静态局部变量是静态存储方式,也就是改变了它的生存期

由函数内部或者块内部变为文件作用域,虽然并不是真正的“文件作用域”,声明在函数内,但是在函数外部无法访问,只是为了避免重名冲突

static作用于全局变量时

在全局变量声明前加static = static全局变量,全局变量本身是静态存储方式,静态全局变量也是静态存储方式,在存储方式上无区别,无改变

主要区别在于非静态全局变量的作用于是整个源程序(由多个源程序组成的话,在各个源文件中都有效);静态全局变量限制了作用域,只在定义该变量的源文件中有效(全局作用域->文件作用域),可避免在其他文件中引起错误

static变量只初始化一次,下一次依照上一次的值

总结:

静态局部变量扩大了局部变量的生存期,静态全局变量缩小了全局变量的作用域

1.3.2 const

const在C语言和C++中存在差异,先来解释其中的区别

在C语言中,Const修饰的变量只是告诉编译器该变量是一个只读的变量,不能通过该变量改写器内存空间中的值,但是其本质上还是一个变量,既然是变

量,就会有内存地址,因此可以通过指针间接修改该地址空间的值,举例如下

image-20230202201857932

在C++中Const修饰的变量被称为常量,其值存放在常量表中

在使用常量时,编译器回到常量表中查询对应的常量,并将其替换,这部分没有涉及内存分配,因此对其取地址是没有意义的

但是当我们非要对该常量去地址时,则编译器会为其临时分配一个内存,并将常量值存入该临时内存中

事实上,在C++中规定必须用const修饰的指针来指向const修饰的常量。

虽然可以使用强制转换的方式,对Const修饰的常量进行去地址,并将其赋值给一个非Const修饰的指针(最好不要这样做)

但打这个指针上的任何改动只会影响到临时分配的内存空间,而不会影响到原常量上

2、 域作用限定符

作用域限定符为两个冒号::,其作用是通知编译器从作用域限定符左侧名字所示的作用域中寻找右侧名字

即指定访问指定空间的成员

2.1 空间域的命名

namespace NewSpace
{
    int time = 3600;
    ...
}//命名可嵌套

2.2 指定空间访问

指定空间 ::操作

实例:

std :: cout << "" << std :: endl//std::代表访问标准库

用全局展开的标准库就可以避免在cout endl前指定标准库也是一个方法,但是对于可能产生的冲突,我们还是采取指定空间访问的方法

2.3 全局展开

将某空间在某个局部或者全局展开,就可以自由使用操作

using namespace ...

2.4 部分展开

部分展开只需要展开我们需要用的操作,比如:

using std :: cout

3、函数重载

在C语言程序的编写中,可能会用到几个功能相同的函数,但是有些细节却不同。

例如:交换两个数的值其中包括(int, float,char,double)这些个类型,我们通常借助不同的命名来完成区分

void Swap1(int* a, int* b);
void Swap2(float* a, float* b);
void Swap3(char* a, char* b);
void Swap4(double* a, double* b);

我们可以看出这样的代码不美观而且不便,于是在C++中人们提出可以用一个函数名定义多个函数,也就是所谓的函数重载

3.1 函数重载规则

  • 函数名称必须相同
  • 参数列表必须不同(个数不同、类型不同、参数排列顺序不同等)
  • 函数的返回类型可以相同也可以不相同
  • 仅仅返回类型不同不足以成为函数的重载

实例:

#include<iostream>
using namespace std;
 
int main()
{
	int max(int a, int b, int c);
	int max(int a, int b);
	int a = 10;
	int b = 20;
	int c = 30;
 
	cout << max(a, b, c) << endl;
	cout << max(a, b) << endl;
	return 0;
}
 
int max(int a, int b, int c)
{
	if (b > a)
		a = b;
	if (c > a)
		a = c;
	return a;
}
 
int max(int a, int b)
{
	return (a > b) ? a : b;
}

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

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

相关文章

13、稀疏矩阵

目录 一、稀疏矩阵的生成 1.利用sparse函数建立一般的稀疏矩阵 2.利用特定函数建立稀疏矩阵 二、稀疏矩阵的运算 一、稀疏矩阵的生成 1.利用sparse函数建立一般的稀疏矩阵 稀疏矩阵指令的调用格式&#xff1a; 示例1&#xff1a;输入一个稀疏矩阵 Asparse([1 2 3 4 5],[…

教你一招完美解决 pptx 库安装失败的问题

上一篇&#xff1a;Python的序列结构及常用操作方法&#xff0c;学完这一篇你就彻底懂了 文章目录前言一、pptx 库是什么&#xff1f;二、安装失败原因及解决方案总结前言 昨天有粉丝问我&#xff0c;为什么Python的 pptx 库老是安装失败&#xff1f;加上国内镜像源也不行&…

分布式微服务2

目录 Nacos注册中心 下载 启动 快速入门 1.在父工程中添加spring-cloud-alilbaba的管理依赖子模块添加nacos的客户端依赖 2.子模块添加nacos的客户端依赖 3.子模块配置文件 4.启动 Nacos服务分级存储模型 集群配置 nacos的负载均衡 Nacos环境隔离 新建命名空间 N…

六、Linux 软件包管理

一、Linux 软件包管理简介 1、软件包分类 源码包 - 脚本安装二进制包 -&#xff08;RPM 包&#xff0c; 系统默认包&#xff09; 2、源码包优缺点 源码包优点&#xff1a; 开源&#xff0c;可以看到&#xff0c;并且可以修改源代码。可以自由选择所需要的工能。软件是编译安…

初识 Linux Shell

学习的第一步&#xff0c;就是要找到 Linux 终端的所在位置。目前较常见的图形化终端有 Konsole、Gnome terminal、xterm 等几种。一般安装后在各个发行版的菜单中搜索即可找到。Gnome terminal 和 Konsole 基本是当前各大流行 Linux 发行版预装最多的终端应用&#xff0c;功能…

分时电价环境下用户负荷需求响应分析方法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

升级JDK11后,执行java -version还是1.8

电脑同时安装两个JDK,如何来回切换1. JDK INSTALL1.1 Download1.2 配置环境变量2. 配置JDK11无效2.1 JDK切换3.Awakening1. JDK INSTALL 1.1 Download 官网下载 JDK Website: https://www.oracle.com/java/technologies/downloads/. oracle账密 zhaonan0212163.com Tomcat123…

论文翻译:Text-based Image Editing for Food Images with CLIP

使用 CLIP 对食物图像进行基于文本的图像编辑 图1&#xff1a;通过文本对食品图像进行处理的结果示例。最左边一栏显示的是原始输入图像。"Chahan"&#xff08;日语中的炒饭&#xff09;和 "蒸饭"。左起第二至第六列显示了VQGAN-CLIP所处理的图像。每个操作…

小程序项目学习--第六章:项目实战二、推荐歌曲-歌单展示-巅峰榜-歌单详情-页面优化

第六章&#xff1a;推荐歌曲-歌单展示-巅峰榜-歌单详情-页面优化 01_(掌握)音乐页面-推荐歌曲的数据获取和展示 推荐歌曲的数据获取的实现步骤 0.封装对应请求接口方法 export function getPlaylistDetail(id) {return hyRequest.get({url: "/playlist/detail",d…

Python中append浅拷贝机制

关于深浅拷贝&#xff0c;最直观的理解就是&#xff1a;深拷贝&#xff1a;拷贝的程度深&#xff0c;自己新开辟了一块内存&#xff0c;将被拷贝内容全部拷贝过来了&#xff1b;浅拷贝&#xff1a;拷贝的程度浅&#xff0c;只拷贝原数据的首地址&#xff0c;然后通过原数据的首…

分享158个ASP源码,总有一款适合您

ASP源码 分享158个ASP源码&#xff0c;总有一款适合您 下面是文件的名字&#xff0c;我放了一些图片&#xff0c;文章里不是所有的图主要是放不下...&#xff0c; 158个ASP源码下载链接&#xff1a;https://pan.baidu.com/s/1DCXBAXJUNMZZpbyxVF5-bg?pwdbwuv 提取码&#x…

react native android环境搭建,使用vscode和夜神模拟器进行开发(适用于0.68+版本)

前言 react native官网教程 使用的是android studio搭建环境&#xff0c;本篇文章使用vscode和夜神模拟器进行搭建环境 版本说明&#xff1a; 0.68.0 及以上版本直接往下看0.67.4 及以下版本请查看另一篇文章&#xff1a;react native android环境搭建&#xff0c;使用vscod…

FineReport学习-【01 帆软报表入门】

界面功能 官方管理面板详解见这里 报表简介 报表类型 报表设计流程 新建数据连接 查看数据库连接&#xff0c;新建一个本地mysql的数据库 新建报表 新建数据集 实例操作 实例1 分组报表 新建文件夹&#xff0c;用来保存报表 将刚刚查询的数据表放入报表中&#xff0c;并插入表…

k8s核心资源ingress

一、简介ingress是分装到service层上层的一个模块&#xff0c;对外提供统一访问入口&#xff0c;ingress底层是nginx实现的&#xff0c;并且分装了域名访问。外界请求首先打到ingress层&#xff0c;ingress再转发给service层&#xff0c;service再负载均衡到其中的一个pod上。i…

关于符合车规的高精度定位产品

文章目录一、什么是P-Box二、ST的P-Box三、导远的P-Box四、华测的P-Box参考来源对于导航产品来说&#xff0c;下一个大的市场可能就是智能驾驶/辅助驾驶&#xff0c;研发符合车规的导航产品也逐渐成了行业趋势。组合导航产品的主流方案是外置的P-Box方案&#xff0c;只需要单GN…

excel定位选取:再谈快捷键Ctrl+G的妙用

一、仅复制可见单元格在日常工作中我们经常会涉及将隐藏或分类汇总后的数据&#xff0c;粘到一个新表。这个时候如果我们直接复制&#xff0c;粘贴会发生什么呢&#xff1f;这是一个分类汇总后的数据&#xff0c;自动生成了分级显示&#xff1a;第1级&#xff0c;总计&#xff…

uniapp提交应用市场打包问题和安装应用弹出隐私政策协议问题(Android)

uni-app 安卓App提交到应用市场踩坑记录&#xff0c;隐私合规检测&#xff0c;参考链接&#xff1a;https://juejin.cn/post/7163595800235212830 打包问题&#xff0c;同时支持32位和64位&#xff1b;https://uniapp.dcloud.net.cn/tutorial/app-android-abifilters.html# 重…

【Android Studio】【Flutter】Android Studio下Flutter环境搭建记录

目录&#xff1a;1、要学flutter&#xff0c;必须先学Dart语言&#xff08;类似C语言&#xff09;2、下载Flutter SDK&#xff08;软件开发工具包&#xff09;3、配置国内镜像4、Android Studio新建Flutter项目5、问题解决&#xff1a;&#xff08;运行flutter doctor命令检查问…

《流浪地球2》的冷思考:如何消除信息孤岛

硬核科幻影片《流浪地球2》成了热议焦点&#xff0c;网友们一方面点赞视觉特效的精益求精&#xff0c;另一方面为引爆月球的故事情节感动&#xff0c;片中一句“50岁以上的出列”让无数观众飙泪。在科技已经进步到地球能在宇宙中“流浪”的未来&#xff0c;仍需牺牲众多“老”宇…

ArkTS初学(一)

想必大家都听说过华为的方舟框架,没错&#xff0c;这就是所说的ArkTS。在HarmonyOS2的时候大家会使用java开发HarmonyOS应用&#xff0c;使用的是Layout来进行布局(用的还是xml文件),之后又出现了js的Component(记不清名字了)的一个功能方便了开发。我们现在就来学习HarmonyOS3…