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

news2024/12/23 16:47:39

 

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

一起加油!

 

目录

一、前言:

二、不同的作用城: 

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

🔑说明:

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

⭐例:不同作用域示例:

☘️注意:

⭐例:暴露指定标识符。

☘️注意:

三、作用域嵌套: 

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

四、总结: 

五、共勉: 


一、前言:

        数据的共享和保护是程序员在编写大型复杂程序时要考虑的主要问题之一,如何在程序内部实现数据最大限度的共享,提高编程效率,同时又能避免非法操作或误操作给数据造成的破坏?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.coloradmin.cn/o/1305281.html

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

相关文章

Java - Spring中Bean的循环依赖问题

什么是Bean的循环依赖 A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你&#xff0c;你也依赖我。 比如&#xff1a;丈夫类Husband&#xff0c;妻子类Wife。Husband中有Wife的引用。Wife中有Husband的引用。 Spring解决循环依赖的机理 Spring为什么可以解决set s…

ubuntu如何远程ssh登录Windows环境并执行测试命令

ubuntu如何远程ssh登录Windows环境并执行测试命令 1 paramiko模块简介1.1 安装paramiko1.2 paramiko基本用法1.2.1 创建SSHClient实例1.2.2 设置主机密钥策略1.2.3 连接SSH服务器1.2.4 执行命令1.2.5 关闭SSH连接1.2.6 异常处理 2 windows的配置2.1 启动OpenSSH服务2.2 配置防火…

【Qt开发流程】之2D绘图1:概述及基本绘制与填充和渐变填充

概述 Qt的绘图系统可以使用相同的API在屏幕和打印设备上进行绘图&#xff0c;并且主要基于QPainter, QPaintDevice和QPaintEngine类。 QPainter用于执行绘图操作&#xff0c;QPaintDevice是一个二维空间的抽象&#xff0c;可以使用QPainter在其上绘制&#xff0c;QPaintEngine…

Android : XUI- SimpleImageBanner+BannerItem带标题的轮播图-简单应用

示例图&#xff1a; 1.导入XUI http://t.csdnimg.cn/qgGaN 2.MainActivity.java package com.example.viewpagerbanne;import android.os.Bundle; import android.view.View; import android.widget.Toast; import androidx.appcompat.app.AppCompatActivity; import com.xu…

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

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

Linux--操作系统

1. 常见的操作系统 Windowsmac OSLinuxiOSAndroid 2. 操作系统的定义 操作系统直接运行在计算机上的系统软件&#xff0c; 它是控制硬件和支持软件运行的计算机程序。 3. 操作系统的作用 向下控制硬件向上支持软件的运行&#xff0c;具有承上启下的作用。 4.总结 操作系统…

Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 is available

记录一次服务调用中的错误 背景&#xff1a;我使用了nacos2.x的版本&#xff0c;同时在同一台服务器的三个docker容器中部署了nacos1、2、3&#xff0c;并将它们连接到了同一个docker网络 错误&#xff1a;Server check fail, please check server xxx.xxx.xxx.xxx,port 9848 …

事件驱动架构 vs. RESTful架构:通信模式对比与选择

1. 通信风格 事件驱动架构&#xff08;EDA&#xff09; 是一种异步通信风格&#xff0c;组件之间通过产生和消费事件进行通信。 事件是表示系统中重大变化或事件的消息&#xff0c;并分发给感兴趣的组件。这种通信模型允许系统的不同部分之间进行解耦和动态交互。 组件充当事件…

MTK Android P Sensor架构(一)

需求场景&#xff1a; 本来如果只是给传感器写个驱动并提供能读取温湿度数据的节点&#xff0c;是一件比较轻松的事情&#xff0c;但是最近上层应用的同事要求我们按照安卓标准的流程来&#xff0c;这样他们就能通过注册一个服务直接读取传感器事件数据了。这样做的好处就是第…

从手工测试进阶中高级测试?如何突破职业瓶颈...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、手工测试如何进…

【教3妹学编程-算法题】需要添加的硬币的最小数量

3妹&#xff1a;2哥2哥&#xff0c;你有没有看到新闻&#xff0c; 有人中了2.2亿彩票大奖&#xff01; 2哥 : 看到了&#xff0c;2.2亿啊&#xff0c; 一生一世也花不完。 3妹&#xff1a;为啥我就中不了呢&#xff0c;不开心呀不开心。 2哥 : 得了吧&#xff0c;你又不买彩票&…

Vue 双向绑定:让数据与视图互动的魔法!(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

人体关键点检测3:Android实现人体关键点检测(人体姿势估计)含源码 可实时检测

目录 1. 前言 2.人体关键点检测方法 (1)Top-Down(自上而下)方法 (2)Bottom-Up(自下而上)方法&#xff1a; 3.人体关键点检测模型训练 4.人体关键点检测模型Android部署 &#xff08;1&#xff09; 将Pytorch模型转换ONNX模型 &#xff08;2&#xff09; 将ONNX模型转换…

【JVM从入门到实战】(一) 字节码文件

一、什么是JVM JVM 全称是 Java Virtual Machine&#xff0c;中文译名 Java虚拟机。 JVM 本质上是一个运行在计算机上的程序&#xff0c;他的职责是运行Java字节码文件。 二、JVM的功能 解释和运行 对字节码文件中的指令&#xff0c;实时的解释成机器码&#xff0c;让计算机…

图论——二分图

图论——二分图 二分图通俗解释 有一个图&#xff0c;将顶点分成两类&#xff0c;边只存在不同类顶点之间&#xff0c;同类顶点之间设有边。称图 G 为二部图&#xff0c;或称二分图&#xff0c;也称欧图。 性质 二分图不含有奇数环图中没有奇数环&#xff0c;一定可以转换为二…

005、Softmax损失

之——softmax与交叉熵 杂谈 我们常用到softmax函数与交叉熵的结合作为损失函数以监督学习&#xff0c;这里做一个小小的总结。 正文 1.softmax的基本改进 所谓softmax就是在对接全连接层输出时候把输出概率归一化&#xff0c;最基础的就是这样&#xff1a; 效果就是这样&…

图文教程:stable-diffusion的基本使用教程 txt2img(多图)

之前我介绍了SD的安装过程&#xff0c;那么这篇将介绍怎么使用SD 使用模型 SD安装好之后&#xff0c;我们只有一个默认的模型。这个模型很难满足我们的绘图需求&#xff0c;那么有2种方法。 1是自己训练一个模型&#xff08;有门槛&#xff09;2是去网站上找一个别人练好的模…

算法通关村第四关—表达式问题(黄金)

表达式问题 一、计算器问题 计算器也是非常常见的问题&#xff0c;我们看一个中等问题。LeetCode227.给你一个字符串表达式s&#xff0c;请你实现一个基本计算器来计算并返回它的值。整数除法仅保留整数部分。  你可以假设给定的表达式总是有效的。所有中间结果将在[-231,231…

关于Anaconda的安装和环境部署(此章专为新手制定)

目录 Anaconda简介 一、软件下载&#xff08;地址&#x1f447;&#xff09; 2&#xff1a;点击下载 3&#xff1a;版本选择&#xff1a; 4&#xff1a;Anaconda的安装包就下载完成了 2&#xff1a;恭喜你&#xff0c;看到这里已经完成安装了 三、部署环境 1&#xff1…

Vue 双向绑定:让数据与视图互动的魔法!(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…