C++——namespace std

命名空间(namespace)

0.使用方法

namespace 命名空间名 {...
}

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

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


#include<iostream>
namespace self_space1 { // 定义命名空间self_space1int num = 1;
}namespace self_space2 { // 定义命名空间self_space2int num = 2;
}
// self_space1与self_space2是两个不同的命名空间int main() {std::cout << self_space1::num << std::endl; // 输出1std::cout << self_space2::num << std::endl; // 输出2
}

2. 命名空间可以不连续

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

namespace self_space1 { // 定义命名空间self_space1int num = 1;
}namespace self_space2 { // 定义命名空间self_space2int 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; // 输出3return 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; // 输出3return 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; // 局部变量numcout << num; // 根据局部变量优先原则,程序输出1return 0;}

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

#include <iostream>
using namespace std;
int num = 2; // 全局变量num
int main() {int num = 1; // 局部变量numcout << num << endl; // 根据局部变量优先原则,该条语句输出1cout << ::num; // 全局域限定,该条语句输出2return 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; // 局部变量numcout << num << endl; // 根据局部变量优先原则,该条语句输出1cout << ::num << endl; // 全局域限定,该条语句输出2cout << 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_spaceint main() {cout << num << endl; // 该条语句输出3return 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.rhkb.cn/news/143735.html

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

相关文章

巨人互动|Facebook海外户Facebook的特点优势

Facebook作为全球最大的社交媒体平台之一&#xff0c;同时也是最受欢迎的社交网站之一&#xff0c;Facebook具有许多独特的特点和优势。本文小编将说一些关于Facebook的特点及优势。 1、全球化 Facebook拥有数十亿的全球用户&#xff0c;覆盖了几乎所有国家和地区。这使得人们…

ios证书类型及其作用说明

ios证书类型及其作用说明 很多刚开始接触iOS证书的开发者可能不是很了解iOS证书的类型功能和概念。下面对iOS证书的几个方面进行介绍。 apple开发账号分类&#xff1a; 免费账号&#xff1a; 无需支付费用给apple&#xff0c;使用个人信息注册的账号 可以开发测试安装&…

文件内容显示

目录 1.浏览普通文件 1.1. 文件内容查看 1.1.1. cat 命令 例&#xff1a; 1.1.2 扩展tac命令&#xff1a; 1.1.3. more 命令 1.1.4. less命令 1.1.5. head命令 1.1.6. tail命令 1.2. 文件属性信息查看 1.2.1. file 命令 1.2.2. stat 命令 2. 文件内容过滤…

计算机竞赛 深度学习OCR中文识别 - opencv python

文章目录 0 前言1 课题背景2 实现效果3 文本区域检测网络-CTPN4 文本识别网络-CRNN5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **基于深度学习OCR中文识别系统 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;…

DSOMEIP丢数据问题分析和总结:

&#xff08;1&#xff09;问题现象 无论使用arm64硬件、x86 ubuntu电脑、ubuntu docker哪种组合进行DSOMEIP event通信&#xff0c;接收端都会在event payload长度增加到一定程度时udp方式出现丢数据现象。 总体上arm64硬件略优于x86 ubuntu电脑&#xff0c;x86 ubuntu电脑略优…

CorelDRAW Graphics Suite2023绿色中文版本下载教程

CorelDRAW Graphics Suite2023版是领先的一体化软件包&#xff0c;它包括多个程序&#xff0c;如CorelDRAW、Corel PHOTO-PAINT、Corel CAPTURE、Corel Font Manager、Duplexing Wizard等&#xff0c;可全部安装&#xff0c;也可根据实际需要选择进行安装&#xff0c;都是最新版…

linux权限机制,

目录 用户与组,id,passwd 查看登录用户whomi,who,w 创建用户 useradd 修改用户信息usermod 删除指定用户userdel 组 ​编辑创建修改删除组groupadd groupmod groupdel 权限 ls-l 修改文件所属用户&#xff0c;所属组 chown,chgrp(change group) 修改权限 chmod 默认权…

CSS 模糊效果 CSS 黑白效果 CSS调整亮度 对比度 饱和度 模糊效果 黑白效果反转颜色

CSS 模糊效果 CSS 黑白效果 CSS调整亮度 饱和度 模糊效果 黑白效果 实现 调整亮度 饱和度 模糊效果 黑白效果 使用 filter1、模糊2、亮度3、对比度4、饱和度5、黑白效果6、反转颜色7、组合使用8、 filer 完整参数 实现 调整亮度 饱和度 模糊效果 黑白效果 使用 filter 1、模糊…

2023软工作业(一)——计算器

班级班级社区作业要求软件工程实践第一次作业-CSDN社区作业目标完成一个具有可视化界面的科学计算器参考文献Fyne 目录 作业要求 项目源码地址 作业目标 0. 界面及功能展示 1. PSP表格 2. 解题思路描述 3. 核心代码 4. 设计与实现过程 5. 程序性能改进 6. 单元测试展…

Qt扫盲-QSqlRelationalTableModel 理论总结

QSqlRelationalTableModel 理论总结 一、概述二、使用概述三、常用 一、概述 QSqlRelationalTableModel的行为类似于QSqlTableModel&#xff0c;但允许将列设置为进入其他数据库表的外键。 二、使用概述 在上面左边的截图显示了 QTableView 中的普通 QSqlTableModel。外键(…

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-GRU-Attention数据分类预测分类效果基本描述模型描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-GRU-Attention数据分类预测&#xff0c;运行环境Matlab2021b及以上&…

Ubuntu 安装PostgreSQL

网上有各种版本的&#xff0c;也可以去官网看官方的文档。我是下载的PostgreSQL-11.4版本的。找到以后直接复制网上的压缩包链接就可以。 $ mkdir /opt/postgresql && cd /opt/postgresql $ wget https://ftp.postgresql.org/pub/source/v11.4/postgresql-11.4.tar.gz…

基于规则架构-架构案例2019(三十九)

电子商务 某电子商务公司为了更好地管理用户&#xff0c;提升企业销售业绩&#xff0c;拟开发一套用户管理系统。该系统的基本功能是根据用户的消费级别、消费历史、信用情况等指标将用户划分为不同的等级&#xff0c;并针对不同等级的用户提供相应的折扣方案。在需求分析与架…

运行软件mfc100u.dll缺失是怎么办?mfc100u.dll丢失解决方法分享

Mfc100u.dll 丢失的问题可能困扰着许多使用计算机的用户。Mfc100u.dll 是一个重要的动态链接库文件&#xff0c;它包含了许多功能模块&#xff0c;如字符串处理、数学计算、文件操作等。当 Mfc100u.dll 文件丢失或损坏时&#xff0c;可能会导致许多应用程序无法正常运行&#x…

OS 模拟进程状态转换

下面的这个博主写的很好 但是他给的代码print部分和语言风格python三识别不了 这个特别感谢辰同学帮我调好了代码 我放在主页上了 估计过两天就可以通过了 《操作系统导论》实验一&#xff1a;模拟进程状态转换_process-run.py-CSDN博客 这个补充一下他没有的&#xff1a;OS…

基于yum制作kylin系统docker镜像

注意&#xff0c;由于线上源版本与iso源存在差异&#xff0c;应采用iso源制作docker镜像 [rootlocalhost yeqiang]# yum install --installroot/home/yeqiang/kylin-docker/ yum 无法找到发布版本&#xff08;可用 --releasever 指定版本&#xff09; 警告&#xff1a;加载 /e…

正交对角化,奇异值分解

与普通矩阵对角化不同的是&#xff0c;正交对角化是使用正交矩阵对角化&#xff0c;正交矩阵是每列向量都是单位向量&#xff0c;正交矩阵*它的转置就是单位矩阵 与普通矩阵对角化一样&#xff0c;正交对角化的结果也是由特征值组成的对角矩阵 本质还是特征向量对原矩阵的拉伸…

【Java】异常

1. Java的异常概念 1.1 异常体系结构 从上图中可以看到&#xff1a; 1. Throwable&#xff1a;是异常体系的顶层类&#xff0c;其派生出两个重要的子类, Error 和 Exception 2. Error&#xff1a;指的是JVM无法解决的严重问题&#xff0c;比如&#xff1a;JVM的内部错误、资源…

澳大利亚新版《2023年消费品(36个月以下儿童玩具) 安全标准》发布 旨在降低危险小零件的伤害

2023年9月4日&#xff0c;澳大利亚政府发布了新的儿童玩具强制性安全标准《2023年消费品(36个月以下儿童玩具)安全标准》&#xff08;Consumer Goods (Toys for Children up to and including 36 Months of Age) Safety Standard 2023&#xff09;。该强制性标准旨在尽可能地降…

MySQL学习笔记20

备份过程需要考虑的因素&#xff1a; 1、必须制定详细的备份计划&#xff08;策略&#xff09;&#xff08;备份频率、时间点、周期&#xff09;。 一天做一次增量、一周做一次全量。 2、备份数据应该放在非数据本地&#xff0c;并建议多份备份。 可以放在另外一台服务器上…