C++共享和保护——(1)作用域

 

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
人生就像骑单车,要想平衡就得往前进!

一起加油!

 

目录

一、前言:

二、不同的作用城: 

⭐例:局部作用域范围的标识符。 

🔑说明:

归纳起来,变量的作用域范围主要包括以下几类:

⭐例:不同作用域示例:

☘️注意:

⭐例:暴露指定标识符。

☘️注意:

三、作用域嵌套: 

⭐例:内部作用域与外部作用域示例标识符的不同作用域:

四、总结: 

五、共勉: 


一、前言:

        数据的共享和保护是程序员在编写大型复杂程序时要考虑的主要问题之一,如何在程序内部实现数据最大限度的共享,提高编程效率,同时又能避免非法操作或误操作给数据造成的破坏?C++为此提供了很好的支持机制。

二、不同的作用城: 

         作用域是指一个标识符在程序中的哪些地方是有效的,C++中的很多作用域是通过大括号来
进行限定的。
        程序里有的标识符只是局部使用,此时把它定义成局部变量比较合适一一只是自己使用,不需要传递给其他函数,如果完全暴露出来,导致其他位置对其进行了非法篡改,反而不是很好但是如果一个标识符在很多地方(如很多函数)要用到,为了避免函数间繁琐地传递参数带来的不便,我们习惯将这样的一些变量设置为全局的,此时变量的作用域就是整个文件。

⭐例:局部作用域范围的标识符。 

#include<iostream>
using namespace std;
int main(){
	int sum=0;
	for(int val=1;val<=10;val++){
		sum+=val;
	}
	cout<<"sum of 1 to 10 inclusive is :"<<sum<<endl;
	return 0;
} 

🔑说明:

        本程序统计1到 10 所有整数之和。程序中定义了三个标识符,main、sum 和val.注意函数名也是一个标识符; main 是在大括号外面定义的,和其他在大括号外面定义的标识符一样,它具有全局作用域具有全局作用域的标识符一旦被声明以后就能够在程序中任何位置被访问。main 函数体内部定义的 sum 变量的作用域从定义开始到 main函数体结束,由于 sum 标识符具有块作用域,因此在 main 函数外部不能访问它;变量val在 for 语句中定义的,只能在 for 语句中使用。 

        因此,可在第一次要使用变量的时候再定义,这样既可以很方便地查到变量定义的位置,也可以提高程序的可读性。

归纳起来,变量的作用域范围主要包括以下几类:

  • ⚡局部作用域;
  • ⚡函数原型作用域; 
  • ⚡类作用域;
  • ⚡文件作用域;
  • ⚡命名空间作用域。 

⭐例:不同作用域示例:

#include<iostream>
using namespace std;

int reused=40;//reused具有文件作用域 

class Date{//Date具有文件作用域 
	private:
		int date;//date具有类作用域,在类内部可以随意访问 
	public:
		void Putdate(int pd);//pd仅在函数声明中有效 
		int Getdate(){
			return date; 
		}
};

void Date::Putdate(int pd){//pd仅在Putdate中有效 
	date=pd;
}

int main(){
	Date d1;//d1具有局部作用域,仅在main函数中有效 
	int m;
	cin>>m;//cin具有命名空间作用域 
	d1.Putdate(m);
	cout<<d1.Getdate();//cout具有命名空间作用域 
	return 0;
}

        在具体了解命名空间作用域之前,有必要先学习命名空间的概念。大型程序开发通常由不同的模块组成,不同的模块可能是由不同的开发小组开发的。不同模快中可能都会定义大量全局的标识符,比如一些类名和函数名等。当系统将它们合成在一起时,会引起不可避免的命名冲突,同样地,在开发大型软件时,也可能会引用不同开发者开发的库,这些库也有可能存在全局标识符冲突的问题。为了避免冲突,可以定义不同的命名空间,只要在个命名空间下没有同名的全局标识符,就可以避免冲突。命名空间的声明方法如下: 

name NS_Example{

class.complex;

                                                         complex add(const complex&a, const complex 6b);

                                        ……//各种声明:类,变量,函数,模板

                                           //和语句块类似,结尾没有分号

                                                             }

        和其他标识符的命名规则一样,命名空间的名称在其定义的作用域范围内必须是唯一的命名空间可以定义在全局作用域中,也可以定义在另一个命名空间中。它不能定义在类中或函数中。 

☘️注意:

命名空间声明末尾没有分号。 

         不同的命名空间确定了不同的作用域,不同的命名空间可以包含名称相同的成员。在命名空间内部可以直接引用当前命名空间中声明的标识符,如果需要引用其他命名空间的标识符,需要加上其他命名空间的名称。
        目前所给的示例程序中使用到的库都在标准命名空间 std 之下;程序中所用到的 cin、cout和endl等都是在 std 中定义的。所以在引用这些标识符时需要在前面加上命名空间,如 std::cin.std::cout 和 std:endl 等,有时在标识符前面总是加上这样的命名空间限定会使语句显得过于冗长。C++会使用 using 语句解决这一问题,使用 using 语句进行声明后,可以使编程人员在引用某个命名空间中的标识符时,不用在前面加上繁琐的前缀。using 语句主要有两种形式,如下所示:

using 命名空间名::标识符名;

using namespace 命名空间名;

        第一种形式将指定的标识符暴露于当前的作用域,使程序员在当前作用域中可以直接引用该标识符;

        第二种形式则将指定命名空间中的所有标识符暴露于当前作用域,使程序员在当前作用域中可以直接引用该命名空间内的任意标识符,前面很多示例采用的都是这种方式。 

⭐例:暴露指定标识符。

#include<iostream>
using std::cin;

int main(){
	int i;
	cin>>i;//正确,cin是命名空间的cin 
	cout<<i;//错误,没有cout的引用说明,必须写完整的前缀 
	std::cout<<i;//正确,表明使用的是std命名空间的cout 
	return 0;
}

☘️注意:

        每次引用声明后面一定要以分号结束,头文件中最好不要包含引用声明,头文件会被其他文件所包含,在头文件中包含命名空间引用声明可能会引起命名冲突等问题。 

三、作用域嵌套: 

        一个作用域可以包含其他一些作用域,被包含的作用域称为内部作用域,包含的作用域称为外部作用域。
        在某个作用域声明了一个标识符后,这个作用域嵌套的所有内部作用域都可以访问这个标识符;在外部作用域定义的标识符也可以在内部作用域中重新定义。

⭐例:内部作用域与外部作用域示例标识符的不同作用域:

#include<iostream>
using namespace std;

int reused=42;//reused具有全局作用域 

int main(){
	int unique=0;//unique具有块作用域 
	cout<<reused<<" "<<unique<<endl;//输出42 0 
	int reused=0;//定义新的局部变量reused后屏蔽了全局的reused 
	cout<<reused<<" "<<unique<<endl;//访问局部reused,输出0 0 
	cout<<::reused<<" "<<unique<<endl;//通过::指定访问全局的reused,输出42 0 
	return 0;
} 

        为了说明内部作用域和外部作用域问题,我们定义了同名的全局变量和局部变量,在实际编程时尽量不要定义同名的全局变量和局部变量,否则会降低程序可读性。 

四、总结: 

  •  作用域是指一个标识符在程序中的哪些地方是有效的。
  • 注意函数名也是一个标识符。
  • 命名空间的名称在其定义的作用域范围内必须是唯一的命名空间可以定义在全局作用域中,也可以定义在另一个命名空间中。
  • 命名空间声明末尾没有分号。
  • 不同的命名空间确定了不同的作用域,不同的命名空间可以包含名称相同的成员。
  • 使用 using 语句进行声明后,可以使编程人员在引用某个命名空间中的标识符时,不用在前面加上繁琐的前缀。
  • 每次引用声明后面一定要以分号结束,头文件中最好不要包含引用声明,头文件会被其他文件所包含,在头文件中包含命名空间引用声明可能会引起命名冲突等问题。
  • 为了说明内部作用域和外部作用域问题,我们定义了同名的全局变量和局部变量,在实际编程时尽量不要定义同名的全局变量和局部变量,否则会降低程序可读性。

五、共勉: 

        以上就是我对C++共享和保护——(1)作用域的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++共享和保护的理解,请持续关注我哦!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单元测试、系统测试、集成测试三者的区别是什么?

实际的测试工作当中&#xff0c;我们会从不同的角度对软件测试的活动进行分类&#xff0c;“单元测试&#xff0c;集成测试&#xff0c;系统测试”&#xff0c;是按照开发阶段进行测试活动的划分。这种划分完整的分类&#xff0c;其实是分为四种“单元测试&#xff0c;集成测试…

2023年最新prometheus + grafana搭建和使用+gmail邮箱告警配置

一、安装prometheus 1.1 安装 prometheus官网下载地址 sudo -i mkdir -p /opt/prometheus #移动解压后的文件名到/opt/,并改名prometheus mv prometheus-2.45 /opt/prometheus/ #创建一个专门的prometheus用户&#xff1a; -M 不创建家目录&#xff0c; -s 不让登录 useradd…

ros的slam建图和导航(含工作空间)

工作空间的结构 准备工作 创建工作空间&#xff08;ros_zy&#xff09; mkdir ros_zy进入工作空间 cd ros_zy创建src文件夹&#xff08;放源程序&#xff09; mkdir src编译工作空间 catkin_make打开vscode&#xff08;从终端打开此工程&#xff09; code .进入工作空间的…

React系列:实现子组件A->父组件-子组件B变量流传

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家,51CTO明日之星 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站:vip.zsqt.cc React系列总结 🎈useState的使用 创建响应式变量的时候,在react是需要使用u…

智能监控平台/视频共享融合系统EasyCVR接入大华SDK后只有一路通道可云台控制该如何解决?

TSINGSEE青犀视频监控汇聚平台EasyCVR可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安防视频监控的能力&…

算法___

文章目录 算法两数之和两数相加 算法 两数之和 题目如下图&#xff1a; 我的答案如下图&#xff1a; 我采用的是最笨的思路&#xff0c;直接暴力的两次循环&#xff0c;第一次外循环是取数组的第一个元素&#xff0c;然后内循环会遍历数组后面除第一个的所有元素&#xff0…

LLM之RAG理论(一)| CoN:腾讯提出笔记链(CHAIN-OF-NOTE)来提高检索增强模型(RAG)的透明度

论文地址&#xff1a;https://arxiv.org/pdf/2311.09210.pdf 检索增强语言模型&#xff08;RALM&#xff09;已成为自然语言处理中一种强大的新范式。通过将大型预训练语言模型与外部知识检索相结合&#xff0c;RALM可以减少事实错误和幻觉&#xff0c;同时注入最新知识。然而&…

【上海大学数字逻辑实验报告】六、时序电路

一、 实验目的 掌握同步二进制计数器和移位寄存器的原理。学会用分立元件构成2位同步二进制加计数器。学会在Quartus II上设计单向移位寄存器。学会在Quartus II上设计环形计数器。 二、 实验原理 同步计数器是指计数器中的各触发器的时钟脉冲输入端连接在一起&#xff0c;接…

【lesson12】表的约束(5)

文章目录 表的约束的介绍外键约束测试建表插入测试建表插入测试 理解外键约束 表的约束的介绍 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保证数据的正确性。…

SpringIOC之ConditionEvaluator

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

C语言--与||符号介绍与短路现象

一.&&且 表达式1&&表达式2&#xff1a;表达式1为真并且表达式2为真&#xff0c;整体表达式才为真&#xff0c;其它为假。 注意短路现象&#xff1a;&#xff08;假&&假->假&#xff09;&#xff08;假&&真->假&#xff09;&#xff0c;如…

GeoPandas实操:读取数据

GeoPandas 支持读取和写入多种地理空间数据格式&#xff0c;如 ESRI Shapefile、GeoJSON、GeoPackage 等&#xff0c;以及与其他 GIS 软件兼容的格式。 1. 读取数据 1.1. 读取ESRI Shapefile数据 ESRI Shapefile&#xff08;简称 Shapefile 或 .shp 文件&#xff09;是一种常…

vue实现移动端适配

目录 1. 使用vw单位&#xff1a;vw是视窗宽度的百分比&#xff0c;可以根据不同设备的屏幕宽度来进行自适应。在Vue中可以通过设置全局CSS样式&#xff0c;将所有的尺寸单位改为vw。 2. 使用Flexible.js&#xff1a;Flexible.js是一个用于淘宝移动端适配的库&#xff0c;可以…

【lesson11】表的约束(4)

文章目录 表的约束的介绍唯一键约束测试建表插入测试建表插入测试建表插入测试修改表插入测试 表的约束的介绍 真正约束字段的是数据类型&#xff0c;但是数据类型约束很单一&#xff0c;需要有一些额外的约束&#xff0c;更好的保证数据的合法性&#xff0c;从业务逻辑角度保…

实验7:索引和视图定义

【实验目的】 1、了解索引和视图的含义 2、熟悉索引和视图的创建规则 3、掌握索引和视图的创建和管理 【实验设备及器材】 1、硬件&#xff1a;PC机&#xff1b; 2、软件&#xff1a;(1)Windows7; (2)Microsoft SQL Server 2012。 【主要内容】 索引的创建、删除、重建…

C# Socket通信从入门到精通(14)——多个异步UDP客户端C#代码实现

前言: 在之前的文章C# Socket通信从入门到精通(13)——单个异步UDP客户端C#代码实现我介绍了单个异步Udp客户端的c#代码实现,但是有的时候,我们需要连接多个服务器,并且对于每个服务器,我们都有一些比如异步发送、异步接收的操作,那么这时候我们使用之前单个异步Udp客…

轻松理解 七大排序算法 (C语言实现)

目录 1. 冒泡排序 基本思想&#xff1a; 时间复杂度&#xff1a; 优化&#xff1a; 代码展示&#xff1a; 特性总结&#xff1a; 2. 直接插入排序 基本思想&#xff1a; 时间复杂度&#xff1a; 代码实现&#xff1a; 特性总结&#xff1a; 3. 简单选择排序 基…

披荆斩棘的「矿区无人驾驶」,能否真正打开千亿级市场?

随着2022年备受瞩目的台泥句容矿无人驾驶运输项目硬核落地&#xff0c;以及相关科技公司开放该矿24小时无人矿卡生产运营直播以证明其项目并非在演示&#xff0c;2023年全国开启了大规模矿区无人驾驶商业化落地&#xff0c;堪称矿区无人驾驶元年。虽然我国矿区无人驾驶市场渗透…

MSPM0L1306例程学习-ADC部分(1)

MSPM0L1306例程学习-ADC部分(1) MSPM0L1306例程学习 使用的TI的官方例程&#xff0c;即SDK里边包含的例程代码。 MCU使用的是MSPM0L1306, 对于ADC部分&#xff0c;有10个例程&#xff1a; 例程理解 ADC的转换有多种工作模式&#xff0c;从最简单的单通道单次转换开始入手…

【LeetCode题目拓展】第207题 课程表 拓展(拓扑排序、Tarjan算法、Kosaraju算法)

文章目录 一、拓扑排序题目二、题目拓展1. 思路分析2. tarjan算法3. kosaraju算法 一、拓扑排序题目 最近在看一个算法课程的时候看到了一个比较好玩的题目的扩展&#xff0c;它的原题如下&#xff1a; 对应的LeetCode题目为 207. 课程表 这个题目本身来说比较简单&#xff…