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++共享和保护的理解,请持续关注我哦!!! 

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

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

相关文章

vue项目中 CDN 是vue本身的依赖可以按需加载还是项目中所有的第三方库都可以按需加载?

这是我看到CDN简介时产生的问题 相信很多小伙伴会有 和我一样的疑问 在这里 我也统一回答一下 CDN&#xff08;内容分发网络&#xff09;是一种通过将数据分发到全球各个节点&#xff0c;以提供快速、可靠的内容传输的技术。在Vue项目中&#xff0c;CDN可以用于按需加载Vue本…

HTML行内元素与块级元素的区别

目录 行内元素&#x1f338;常见的行内元素&#x1f338;行内元素&#xff08;内联元素&#xff09;的特性 块级元素&#x1f338;常见的块级元素&#x1f338;块级元素的特性 相互转换(display)&#x1f338;行内块状元素的特性 行内元素 &#x1f338;常见的行内元素 <s…

MicroSD 卡 使用读卡器 读取速度测试

设备 - - 电脑为m.2固态硬盘 usb口为USB3.2 gen2接口(即支持1GB/s的接口) cpu: amd3600 测试方案1 直接MicroSD卡放入读卡器测试 38MB/s 从sd卡复制到本地C盘 测试方案2 MicroSD卡使用闪迪的SD卡套套上之后一起插入读卡器 76MB/s 从sd卡复制到本地C盘

HCIA-H12-811题目解析(10)

1、【单选题】DHCP客户端在租期到达哪个比例时第一次发送续租报文&#xff1f; 2、【单选题】在WLAN中用于标识无线网络&#xff0c; 区分不同的无线网络的是&#xff1f; 3、【单选题】我们在笔记本电脑上搜索可接入无线网络时&#xff0c;显示出来的网络名称实际是 4、【单…

[go 面试] 雪花算法与分布式ID生成

关注公众号【爱发白日梦的后端】分享技术干货、读书笔记、开源项目、实战经验、高效开发工具等&#xff0c;您的关注将是我的更新动力&#xff01; 生成全局唯一ID的雪花算法原理 雪花算法是一种用于生成全局唯一ID的算法&#xff0c;最初由Twitter开发&#xff0c;用于解决分…

PPT制作的几个注意事项

PPT制作的几个注意事项 字数不可过多字体大小字体颜色排版问题PPT篇末致谢什么是好的PPT关于演讲不要念PPT说话时面向观众。讲话的时候抖腿其他 事先声明&#xff1a; 以下展示的PPT就PPT制作技巧而言&#xff0c;与其内容无关。 字数不可过多 做PPT最忌讳的就是满篇全是文字&…

SpringBoot应用开发指南(01)

目录 引言1. SpringBoot简介1.1 什么是SpringBoot1.1.1 背景1.1.2 优势1.1.3 核心概念 1.1.3 特点 2. SpringBoot入门2. SpringBoot集成MyBatis3. SpringBoot集成PageHelper3.1 什么是PageHelper 通过切面实现分页4. SpringBoot集成Druid总结 引言 在当今软件开发领域&#xf…

Django回顾【六 】

目录 一、Cookie和Session 【1】Cookie 【2】Session 二、中间件 【1】 什么是中间件 【2】作用 【3】自定义中间件 三、CSRF认证相关 【1】CSRF是什么 【2】CSRF攻击原理 【3】CSRF攻击防范 四、auth的使用 【1】author是什么 【2】auth模块常用方法 authentic…

十大shell脚本任务(一)日志文件分析器

十大脚本任务&#xff1a; 日志文件分析器&#xff1a; 目标&#xff1a;编写一个脚本&#xff0c;自动分析服务器日志文件&#xff0c;提取关键错误信息&#xff0c;并发送通知。价值&#xff1a;实时监控系统状态&#xff0c;及时响应问题。 备份和恢复脚本&#xff1a; 目标…

P4 Qt基础控件——工具按钮toolButton(上)

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f33a;本篇简介 &#xff1a;这一章我们学一…

鸿蒙系统扫盲(五):再谈鸿蒙开发用什么语言?

前段时间&#xff0c;发表了鸿蒙系统扫盲&#xff08;三&#xff09;&#xff1a;鸿蒙开发用什么语言&#xff1f;这篇文章&#xff0c;收到一些网友的提问&#xff0c;一一解答了&#xff0c;还有网友对我进行了严厉的批评和尖锐的指责&#xff0c;说我有点颠倒是非&#xff0…

【lesson9】表的约束(2)

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

WT588F02B-8S语音芯片在水波炉中的应用:提升用户体验与安全性

在现代家电领域&#xff0c;语音芯片的应用日益普及&#xff0c;为各类产品增添了人性化、智能化的元素。以水波炉为例&#xff0c;一种新型的家用电器&#xff0c;它结合了微波炉和烤箱的功能&#xff0c;通过采用WT588F02B-8S语音芯片&#xff0c;使得水波炉在操作、提示、安…

【Flink名称解释一】什么是cataLog

Catalog 提供了元数据信息&#xff0c;例如数据库、表、分区、视图以及数据库或其他外部系统中存储的函数和信息。 数据处理最关键的方面之一是管理元数据。 元数据可以是临时的&#xff0c;例如临时表、或者通过 TableEnvironment 注册的 UDF。 元数据也可以是持久化的&#x…

android项目实战之Android 11(API等级29)或更高版本,检测键盘的弹出和收起

如题 在Android 11&#xff08;API等级29&#xff09;或更高版本中&#xff0c;由于隐私限制&#xff0c;无法直接检测键盘的弹出和收起。这是由于Android系统对于键盘弹出和收起的检测进行了限制&#xff0c;以保护用户的隐私。 实现方案 public class KeyboardObserver { …

Typescript中Partial数据类型在项目中的实际应用

在TypeScript中&#xff0c;Partial是一个内置的泛型类型&#xff0c;用于将给定的类型T 的所有属性转换为可选属性。换句话说&#xff0c;Partial<T> 可以帮助我们将一个类型中的所有属性变为可选属性&#xff0c;这在某些情况下非常有用。 例如&#xff1a;设有一个接…

2023-12-12 AIGC-AI如何处理信息和提问

摘要: 2023-12-12 AI如何处理信息和提问 AI如何处理信息和提问 对于基于自然语言处理&#xff08;NLP&#xff09;的模型&#xff0c;如ChatGPT这样的大型语言模型。这个过程可以分为几个关键步骤&#xff1a; 1. 接收和解析输入 接收输入&#xff1a;当用户提出一个问题时&…

经典策略筛选-20231212

策略1&#xff1a; 龙头战法只做最强&#xff1a;国企改革 ----四川金顶 1、十日交易内出现 涨停或 &#xff08;涨幅大于7个点且量比大于3&#xff09; 2、JDK MACD RSI OBV BBI LWR MTM 六指标共振 3、均线多头 4、 筹码峰 &#xff08;锁仓&#xff09; 5、现价>…

最强文生图跨模态大模型:Stable Diffusion

文章目录 一、概述二、Stable Diffusion v1 & v22.1 简介2.2 LAION-5B数据集2.3 CLIP条件控制模型2.4 模型训练 三、Stable Diffusion 发展3.1 图形界面3.1.1 Web UI3.1.2 Comfy UI 3.2 微调方法3.1 Lora 3.3 控制模型3.3.1 ControlNet 四、其他文生图模型4.1 DALL-E24.2 I…

Unity光照模型实践

光照作为3D渲染中最重要的部分之一&#xff0c;如何去模拟真实环境的光照是重要的研究内容&#xff0c;但是现实环境光照过于复杂&#xff0c;有很多经典好用的光照模型去近似真实光照。 根据基础的Phong模型 最终某个点的结果为 环境光Ambient 漫反射光Diffuse 高光Specula…