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本…

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、【单…

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…

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;从业务逻辑角…

经典策略筛选-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…

一文讲解关于MCU启动原理的几个关键问题

MCU最开始一启动后去哪里读代码&#xff1f; CPU上电启动后被设计为去地址0x00000000位置处读取代码&#xff1b;首先会连续读取两个字&#xff0c;分别是栈指针初始值和复位异常处理函数的地址&#xff1b;然后跳去执行复位异常处理函数。 当然在一些早期的ARM处理器设计中&a…

在Spring Cloud中使用组件Ribbon和Feign,并分别创建子模块注册到Eureka中去

ok&#xff0c;在上篇文章中我们讲了在Spring cloud中使用Zuul网关&#xff0c;这篇文章我们将Spring Cloud的五大核心组件的Ribbon和Feign分别创建一个微服务模块。 题外话&#xff0c;本篇博客就是配置子模块&#xff0c;或者说是微服务&#xff0c;然后将微服务正式启动之前…

Stimulus—需求形式化建模和验证工具

产品概述 Stimulus是法国达索公司产品&#xff0c;其目的是通过需求建模分析来验证需求的正确性。Stimulus的核心理念是运用“自然语言”对功能性需求进行建模&#xff0c;并通过仿真来查找需求中的缺陷&#xff0c;例如需求一致性、不二义性和完整性检查等。借助Stimulus可以在…

2023-12-05 Qt学习总结9

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言二十五 QFile文件操作总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 二十五 QFile文件操作 QFile是Qt提供的文件读写类&#xff0c;支持对文件进行读写、复制、重命名、删除等操作。常用C函数如下&…

内核上项目【通信】

文章目录 目的操作步骤逆向分析实现代码参考文献 目的 在Win7 64位系统上编写驱动利用ExRegisterAttributeInformationCallback注册回调进行通信 操作步骤 1.利用MmGetSystemRoutineAddress获取ExRegisterAttributeInformationCallback中ExpDisSetAttributeInformation、Exp…

接口自动化多层嵌套json数据处理代码实例

最近在做接口自动化测试&#xff0c;响应的内容大多数是多层嵌套的json数据&#xff0c;在对响应数据进行校验的时候&#xff0c;可以通过&#xff08;key1.key2.key3&#xff09;形式获取嵌套字典值的方法获取响应值&#xff0c;再和预期值比较 1 2 3 4 5 6 7 8 9 10 11 12 13…

Enabling Application Engine Tracing 启用应用程序引擎跟踪

Enabling Application Engine Tracing 启用应用程序引擎跟踪 By default, all Application Engine traces are turned off. To see a trace or a combination of traces, set trace options before you run a program. 默认情况下&#xff0c;所有应用程序引擎跟踪都处于关闭…

自动化测试基础知识:什么是自动化测试?需要学习哪些知识与工具!

1、自动化测试概念 自动化测试是把以人为驱动的测试行为转化为机器执行的一种过程。通常&#xff0c; 在设计了测试用例并通过评审之后&#xff0c;由测 试人员根据测试用例中描述的规程一步步执行测试&#xff0c;得到实际结果与期望结果的比较。简言之&#xff0c;自动化测试…

12.12 作业

1&#xff0c; 源代码&#xff1a; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);speerornew QTextToSpeech(this);idstartTimer(1000);//每隔一秒&#xf…