C++——namespace std

news2024/11/20 19:46:35

命名空间(namespace)

0.使用方法

namespace 命名空间名 {
    ...
}

1. 每个命名空间都是一个作用域

        同其他作用域类似,命名空间中的每个名字都必须表示该空间内的唯一实体。因为不同命名空间的作用域不同,所以在不同命名空间内可以有相同名字的成员。


#include<iostream>
namespace self_space1 { // 定义命名空间self_space1
	int num = 1;
}

namespace self_space2 { // 定义命名空间self_space2
	int num = 2;
}
// self_space1与self_space2是两个不同的命名空间

int main() {
	std::cout << self_space1::num << std::endl; // 输出1
	std::cout << self_space2::num << std::endl; // 输出2
}

2. 命名空间可以不连续

        命名空间的定义可以不连续的特性使得我们可以将几个独立的接口和实现文件组成一个命名空间,定义多个类型不相关的命名空间也应该使用单独的文件分别表示每个类型。
        命名空间可以在几个部分中分开定义,即命名空间是累计的。一个命名空间可以分散在多个文件中。如下代码所示。

namespace self_space1 { // 定义命名空间self_space1
	int num = 1;
}

namespace self_space2 { // 定义命名空间self_space2
	int num = 2;
}

3. 全局命名空间

        全局作用域中定义的名字(即在所有类、函数以及命名空间之外定义的名字)也就是定义在全局命名空间global namespace中。全局作用域是隐式的,所以它并没有名字,下面的形式表示全局命名空间中一个成员:

::member_name

给出示例,如下所示。 

#include<iostream>
int num = 1;
int main() {
	std::cout << ::num << std::endl; // 输出1
}

4. 嵌套的命名空间 

        命名空间是可以嵌套的,并且如果两个命名空间里面定义相同名字的变量,这两个变量名是不冲突的。如下代码所示。

namespace foo {
    namespace bar {
        int num;
    }
}
​
// 常用调用方式
foo::bar::num

如果我们要访问命名空间里嵌套的命名空间的变量该如何访问呢?给出如下示例。
方法一:

/*命名空间的嵌套使用*/
#include <iostream>
using namespace std; 
namespace self_space1 { // 定义一个self_space1的嵌套空间
    namespace self_space2 {
        int num = 3;
    }
}
//方法一
int main() {
    cout << self_space1::self_space2::num << endl; // 输出3
    return 0;

}

方法二: 

/*命名空间的嵌套使用*/

#include <iostream>
using namespace std; 
namespace self_space1 { // 定义一个self_space的嵌套空间
    namespace self_space2 {
        int num = 3;
    }
}
// 方法二
using namespace self_space1; // 展开命名空间self_space1
int main() {
    cout << self_space2::num << endl; // 输出3
    return 0;
}

5.命名空间的合并

        如果我们在多个文件里面定义同一个命名空间,会自动合成一个命名空间(前提是这两个命名空间中的变量名不相同)。如下代码所示。
namespace.h 文件中的代码如下所示。

C++cin_cout.cpp 文件中的代码如下所示。 

 运行C++cin_cout.cpp文件中的程序,结果如上图所示。

        如果定义同名的变量,会发生冲突。
        我们分别在namespace.h文件与C++cin_out.cpp两个不同的文件中定义命名空间namespace,在空间中我们定义相同的变量num,如下代码所示。这样定义的结果是,num变量被多次初始化,程序报错。

 结果报错,错误原因如下:

全局域及局部域 

示例:全局域及局部域的对比 

#include <iostream>
using namespace std;
int num = 2; // 全局变量num
int main() {
    int num = 1; // 局部变量num
    cout << num; // 根据局部变量优先原则,程序输出1
    
    return 0;

}

        上述代码运行结果为1,即将第二个num (局部变量) 打印出。如果我们想将第一个num (值为2) 打印出,该如何呢?
        这个时候我们只需要考虑域作用限定,即在cout << num;中的num前面加上::,如下代码所示。

#include <iostream>
using namespace std;
int num = 2; // 全局变量num
int main() {
    int num = 1; // 局部变量num
    cout << num << endl; // 根据局部变量优先原则,该条语句输出1
    cout << ::num; // 全局域限定,该条语句输出2
    return 0;

}

        上述代码中第一条cout语句打印结果为1,第二条cout语句打印结果为2,cout << ::num;输出2的原因是num前面的::作用。

命名空间域

        一般情况下,一个项目都是多个人共同去完成,假设A人已经定义了一个变量a,而B人也想定义一个a变量,这个时候该如何呢?
        办法是:使用命名空间(namespace),如下代码段所示,在该代码段中,我们使用namespace定义了一个名为self_space的空间,在该空间中,我们定义了一个int型的变量num,其赋值为3。

namespace self_space{ // 定义一个self_space的空间
    int num = 3;
}

命名空间会把里面定义的变量和外面的变量隔离开来,编译器不会主动访问命名空间。

        如果我们想要访问命名空间中的变量,即上述命名空间self_space中的变量num,该如何呢?
方法:
       
 法一:在::(域作用限定)前面加上命名空间的名字即可访问,即self_space::num即可,如下代码所示。

#include <iostream>
using namespace std;
namespace self_space{ // 定义一个self_space的空间
    int num = 3;
}
int num = 2; // 全局变量num
int main() {
    int num = 1; // 局部变量num
    cout << num << endl; // 根据局部变量优先原则,该条语句输出1
    cout << ::num << endl; // 全局域限定,该条语句输出2
    cout << self_space::num; // 该条语句输出3,输出命名空间self_space中的num变量
    return 0;

}

法二:展开命名空间,展开之后不需要指定访问。

#include <iostream>
using namespace std;
namespace self_space { // 定义一个self_space的空间
    int num = 3;
}
using namespace self_space; // 使用命名空间self_space

int main() {
    cout << num << endl; // 该条语句输出3
    return 0;

}

命名空间的变量与全局变量冲突问题 

        若我们创建了一个全局变量num,又在命名空间self_space中创建了一个变量num,并且将命名空间self_space展开,则会优先访问哪一个变量num呢?答案是程序会报错,错误为变量num不明确。如下代码所示。

        为什么会报错呢?因为展开的意思就是暴露到全局,也就是和全局冲突了,编译器也不知道访问哪个了,所以using namespace不要轻易去用,因为命名空间就是为了解决命名冲突,结果你把它暴露到全局那不就毫无意义了吗?
        我们从上面能发现一个什么结论呢?优先访问局部域,然后是全局域、展开命名空间或者指定访问域。

std

使用方法:

using namespace std;

        有些人写C++的时候会写上面一句代码,那这个代码是什么意思呢?很显然,展开了名为std的命名空间,C++库里面的东西都在std这个命名空间里面,展开之后加上头文件才可以使用C++库里面的东西,但是我们把它们全都展开了好不好?答案是不好,因为这样容易发生命名冲突,这在上述例子中我们已经展示。所以我建议如果写项目不要全展开,指定展开。用什么展开什么,比如我要用cout就展开cout。
 即using std::cout;

在日常练习中可全部展开。

部分参考自:

C++入门(命名空间和std)_c++ std_花与剑与花的博客-CSDN博客

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

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

相关文章

Neural Insights for Digital Marketing Content Design 阅读笔记

KDD-2023 很值得读的文章&#xff01; 1 摘要 电商里&#xff0c;营销内容的实验&#xff0c;很重要。 然而&#xff0c;创作营销内容是一个手动和耗时的过程&#xff0c;缺乏明确的指导原则。 本文通过 基于历史数据的AI驱动的可行性洞察&#xff0c;来弥补 营销内容创作 和…

96 # cookie

cookie 和 session 和 sessionStorage 和 localStorage localStorage 和 sessionStorage 本地储存&#xff08;发送请求不会携带&#xff09;&#xff0c;不能跨域localStorage 浏览器关闭后不会清空&#xff0c;必须手动清空sessionStorage 浏览器关闭后就会销毁http 无状态的…

【Vue】条件渲染列表渲染来啦

hello&#xff0c;我是小索奇哈&#xff0c;精心制作的Vue系列持续发放&#xff0c;涵盖大量的经验和示例&#xff0c;由浅入深进行讲解。 本章给大家讲解的是条件&列表渲染&#xff0c;前面的章节已经更新完毕&#xff0c;后面的章节持续输出&#xff0c;有任何问题都可以…

Anaconda启动错误

错误 An unexpected error occurred on Navigator start-up | Could not find a suitable TLS CA certificate bundle, invalid path 导致Anaconda启动失败&#xff01; [解决办法]1 找到anaconda的安装目录&#xff0c;该目录下的__init__.py 这两处分别改为verifyself.sessio…

程序员不得不知道的排序算法-上

目录 前言 1.冒泡排序 2.选择排序 3.插入排序 4.希尔排序 5.快速排序 6.归并排序 总结 前言 今天给大家讲一下常用的排序算法 1.冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地从待排序的元素中比较相邻的两个元素&a…

如何制作gif动图gif (多图合成gif、GIF录制软件、视频制作成GIF动图)

文章目录 1 在线制作多图合成gif动画2 GIF录制软件3 将现有的视频 制作成GIF动图 1 在线制作多图合成gif动画 在线制作gif动画链接:https://www.matools.com/gif ①选择需要制作gif动画的图片将其添加 ②调整时间间隔&#xff0c;图片宽高等设置 ③一键生成gif ④下载到本…

十年耕耘,致力于让垂直领域合作企业提升竞争力

2013年6月叶帆科技公司成立&#xff0c;时光如驹&#xff0c;距今已经十年了&#xff08;叶帆科技的前身叶帆工作室&#xff0c;官方博客上的第一篇博文发表于2004年6月&#xff0c;已近二十年了&#xff09;。 十年时间&#xff0c;初心不变&#xff0c;一直和各垂直领域的企…

最新AI写作系统ChatGPT源码/支持GPT4.0+GPT联网提问/支持ai绘画Midjourney+Prompt应用+MJ以图生图+思维导图生成

一、智能创作系统 SparkAi创作系统是基于国外很火的ChatGPT进行开发的Ai智能问答系统。本期针对源码系统整体测试下来非常完美&#xff0c;可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作ChatGPT&#xff1f;小编这里写一个详细图文教程吧&…

使用ElementUI完成登入注册的跨域请求提高开发效率

&#x1f3ac; 艳艳耶✌️&#xff1a;个人主页 &#x1f525; 个人专栏 &#xff1a;《Spring与Mybatis集成整合》​​​​​​​ ⛺️ 生活的理想&#xff0c;为了不断更新自己 ! 目录 ​编辑 1、前言 1.1.什么是ELementUI 2、完成登陆注册前端页面 2.1环境搭建 运行…

通过pfx格式证书生成Nginx的SSL证书

1、安装openssl 工具地址&#xff1a;Win32/Win64 OpenSSL Installer for Windows - Shining Light Productions 安装完成后&#xff0c;自行配置环境变量。 2、生成证书 &#xff08;1&#xff09;以管理员身份运行cmd&#xff0c;进入到pfx文件的目录&#xff1a; &#x…

CSS详细基础(二)文本样式

插播一条CSS的工作原理&#xff1a; CSS是一种定义样式结构如字体、颜色、位置等的语言&#xff0c;被用于描述网页上的信息格式化和显示的方式。CSS样式可以直接存储于HTML网页或者单独的样式单文件。无论哪一种方式&#xff0c;样式单包含将样式应用到指定类型的元素的规则。…

postman记录backup

之前一直未登录postman&#xff0c;在临时空间处理请求&#xff0c;可能是因为postman更新了&#xff0c;导致其记录没了 别着急&#xff01; 首先我们先登录postman&#xff0c;有谷歌登录方式等 第一步、登录后点击import 第二步、点击files 第三步、找到c:/users/AppData…

三、VXLAN静态方式实验举例

VXLAN静态方式实验举例 1.1、静态方式部署集中式网关1.1.1、VXLAN隧道建立1.1.2、MAC地址动态学习1.1.3、同子网已知单播报文转发1.1.4、同子网BUM报文转发1.1.5、跨子网报文转发1.1.6、配置VXLAN接入业务部署方式 1.2、配置举例&#xff0c;相同网段互通&#xff08;静态方式&…

JVS低代码开发工具:触发逻辑引擎后对象变量节点回显配置说明

使用说明 通常业务中会涉及到表单上部分字段填写后通过触发逻辑处理已填写的数据进行回显到表单上&#xff0c;这时我们可以采用业务逻辑来配置对象变量节点进行表单数据回显。 对象变量&#xff1a;将自定义字段重新组装新的数据结构&#xff0c;数据结构类型为对象。 设计…

【网络安全】2023年堡垒机品牌大全

随着大家网络安全意识的增加&#xff0c;随着国家等保政策的严格执行&#xff0c;越来越多的企业开始采购堡垒机。这里就给大家总结了部分堡垒机品牌&#xff0c;让大家参考参考。 2023年堡垒机品牌大全 1、行云堡垒 2、JumpServer 3、安恒 4、骞云 5、齐治 6、阿里云 …

ahk系列——ahk_v2实现win10任意界面搜狗翻译

1、准备环境 win10或者以上系统安装ahkv2_64环境&#xff0c;安装包安装好后会有32和64位的unicode版本准备一个编译器&#xff0c;我用idea&#xff0c;不会ahk编程的我会把编译好的exe连接放到最后需要 联网 才能翻译 2、 使用方法 选中需要翻译的文字&#xff0c;然后ctr…

【算法】递归(高阶题目) -随时补充

文章目录 岛问题汉诺塔问题牛群繁衍数量问题求字符串的全部子序列字符串的全排列数字的全排列I数字的全排列IIN皇后IIN皇后I 岛问题 递归的方法: 遍历岛这个二维数组&#xff0c;如果当前数为1&#xff0c;则进入感染函数并将岛个数1感染函数&#xff1a;其实就是一个递归标注…

win11+wsl+git+cmake+x86gcc+armgcc+clangformat+vscode环境安装

一、安装wsl &#xff08;1&#xff09;打开power shell 并运行&#xff1a; Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform &#xff08;2&#xff0…

通过containerd部署k8s集群环境及初始化时部分报错解决

目录 一.基础环境配置&#xff08;每个节点都做&#xff09; 1.hosts解析 2.防火墙和selinux 3.安装基本软件并配置时间同步 4.禁用swap分区 5.更改内核参数 6.配置ipvs 7.k8s下载 &#xff08;1&#xff09;配置镜像下载相关软件 &#xff08;2&#xff09;配置kube…

用CRM系统协助销售跟踪客户

客户跟踪对销售来说非常重要&#xff0c;销售不及时跟进很容易导致潜在客户流失。那么对于销售来说&#xff0c;该如何做好客户跟踪呢&#xff1f;或许可以使用CRM客户管理系统。下面来说说&#xff0c;CRM系统如何协助销售跟踪客户&#xff1f; 智能联系客户提醒 销售人员通…