using namespace std 是什么意思——C++命名空间

news2024/9/21 20:38:41

目录

  • namespace命名空间
    • 局部域和全局域
    • namespace
      • 展开命名空间
      • 指定命名空间
    • 命名空间的嵌套
    • 不同文件中的同名命名空间
  • using namespace std 是什么意思

我们先看一段C代码:

#include <stdio.h>
#include <stdlib.h>

int rand = 0;

int main()
{
	printf("%d", rand);
	return 0;
}

我们直接看可能不会发现问题,但是这段代码是运行不出来的
在这里插入图片描述

原因就是rand名与stdlib.h库中的函数命冲突,所以运行不出来

命名冲突的发生有2个原因:
1.跟库中冲突
2.一个项目不同部分由不同人编写,最后合并时发生命名冲突

为了避免自己定义的变量名或函数命与库中的名冲突,于是在C++中引入了命名空间这一概念。


namespace命名空间

局部域和全局域

我们先了解一下 局部域全局域,在同一域中不可以创建2个同名变量,但在同一域中可以创建2个同名变量

下面在局部域和全局域建立2个同名变量

#include <iostream>

int a = 1;//全局域

int main()
{
	int a = 0;//局部域
	printf("%d\n", a);
	return 0;
}

那么在这里如果要输出a的值,那么输出的是全局域中的值还是局部域中的值呢?

答案是:输出局部域中的a
在这里插入图片描述
所以可以得出一个结论:搜索范围是先局部域再全局域,默认是在局部域中搜索,如果没有局部域,再在全局域中搜索

如果想要输出全局域中的a怎么办呢?

使用::域作用限定符,::a就表示全局域中的a

#include <iostream>

int a = 1;//全局域

int main()
{
	int a = 0;//局部域
	printf("%d\n", ::a);
	return 0;
}

namespace

下面我们通过namespace创建一个命名空间域

namespace test
{
	int a = 2;
}

那么现在我们怎么输出这个命名空间域中的a呢?

C++中的搜索范围是:局部域->全局域,如果不展开命名空间或指定访问命名空间,是不会去命名空间中搜索的
只有展开命名空间或指定访问命名空间才会搜索到命名空间域中

可以看到,不展开命名空间也不指定访问命名空间,是不会输出命名空间域中的a

#include <iostream>
namespace test
{
	int a = 2;
}

//int a = 1;//全局域

int main()
{
	//int a = 0;//局部域
	printf("%d\n", ::a);
	return 0;
}

在这里插入图片描述


展开命名空间

下面用using namespace test展开命名空间域

说明:这里展开的意思是编译器是否去域里进行搜索
#include本质不同,不要错误理解

#include <iostream>
namespace test
{
	int a = 2;
}
using namespace test;//展开命名空间域

int a = 1;//全局域

int main()
{
	int a = 0;//局部域
	printf("%d\n", a);
	return 0;
}

这时,三个域中的a是可以共存的,按照搜索顺序,这里会输出局部域中的a
这里如果删除掉全局域和局部域中的a,这里就会输出命名空间域中的a

如果去掉局部域中的a,展开命名空间域,此时在全局域和命名空间域中都有一个a,那么这时如果不使用::,会输出哪个a

#include <iostream>
namespace test
{
	int a = 2;
}
using namespace test;//展开命名空间域

int a = 1;//全局域

int main()
{
	//int a = 0;//局部域
	printf("%d\n", a);
	return 0;
}

答案是会发生命名冲突
在这里插入图片描述

这是因为展开后就代表着里面的内容就暴露到全局,与原全局域中的a冲突

所以可以看出,using namespace不是特别好,using namespace的本意是为了防止冲突,但是展开后又会发生冲突

所以不要轻易的使用using namespace


指定命名空间

我们还可以通过展开命名空间的方法去搜索命名空间域中的a
也是使用域作用限定符::

printf("%d\n", a);//输出局部域中的a
printf("%d\n", ::a);//输出全局域中的a
printf("%d\n", test::a);//输出命名空间域中的a

这样,就不会发生任何冲突
所以,如果只想使用某个命名空间中的一两个函数或变量,指定命名空间就可以,没有必要展开整个命名空间


命名空间的嵌套

命名空间是支持嵌套的,因为如果我们把所有的变量、函数、结构都放在一个命名空间中时,也会不可避免的发生冲突

//命名空间的嵌套
namespace A1
{
	int aa = 10;
	namespace A2
	{
		int aa = 20;
	}
}

怎么去访问嵌套的命名空间中的元素呢?
多次使用::

printf("%d\n" ,A1::aa); //访问A1中的aa
printf("%d\n", A1::A2::aa);//访问被嵌套的A2中的aa

不同文件中的同名命名空间

在不同文件中的同名命名空间,最终会合并在一起

这里我们在2个不同的头文件中创建了同名命名空间
在这里插入图片描述

到了源文件中,这2个命名空间就自动合并了

#include "A.h"
#include "B.h"


int main()
{
	std::cout << hhh::a << std::endl;
	std::cout << hhh::b << std::endl;

}

using namespace std 是什么意思

std是C++库的命名空间,std中包含了STL和C++库
在这里插入图片描述

C++中常用的输入输出也都在std中,所以我们平常在创建cpp文件后都会第一时间把using namespace std写上

#include <iostream>
using namespace std;

int main()
{
	cout<<"hello"<<endl;
}

通过前面的内容,我们知道 直接展开会有风险,如果自己定义跟库重名,就会报错
所以在平时日常练习时可以展开,在一些项目中建议指定访问,不轻易展开命名空间

下面是通过指定访问实现输出:

#include <iostream>


int main()
{
	std::cout<<"hello"<<std::endl;
	std::cout<<"hello"<<std::endl;
	std::cout<<"hello"<<std::endl;
	std::cout<<"hello"<<std::endl;
}

在每一个cout和·endl前面都要加上std::,这么看起看来十分麻烦且枯燥,所以还有一种写法。就是将常用的展开

//将常用的展开
using std::cout;
using std::endl;

int main()
{
	cout << "hello" << endl;
}

这样写,即避免了直接展开命名空间的风险,也减少了写std的次数

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

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

相关文章

6.2 统计量与抽样分布

学习目标&#xff1a; 我的理解: 统计量是从一个样本中计算得到的数值&#xff0c;用于描述样本的某种特征或性质。统计量可以用来推断总体的特征或性质&#xff0c;因为样本是总体的一部分。 通常&#xff0c;统计量是通过对样本中的数据进行计算得到的&#xff0c;例如平均…

3年轻人20万开店日营业额79.2元,年轻人开店还能赚到钱吗?

最近&#xff0c;河南郑州的蔡先生和2个朋友合伙开一家汉堡店&#xff0c;生意很惨淡&#xff0c;日营业额79.2元。 蔡先生表示&#xff0c;他们开店失败的最大原因就是没有做好前期准备工作&#xff0c;产品没有吸引人的特色&#xff0c;导致正式营业后吸引不到客户。 蔡先生用…

Python 实现海康机器人工业相机 MV-CU060-10GM 的实时显示视频流及拍照功能

一、背景介绍 1、最近项目中需要给客户对接海康机器人工业相机 MV-CU060-10GM&#xff1b; 2、客户要求通过部署的管理平台&#xff0c;可以在页面上实现如下功能&#xff1a; 1&#xff09;相机视频流开始预览&#xff1b; 2&#xff09;相机视频流停止预览&#xff1b; 3&am…

三月份跳槽了,历经阿里测开岗4轮面试,不出意外,被刷了...

大多数情况下&#xff0c;测试员的个人技能成长速度&#xff0c;远远大于公司规模或业务的成长速度。所以&#xff0c;跳槽成为了这个行业里最常见的一个词汇。 前几天&#xff0c;我看到有朋友留言说&#xff0c;他在面试阿里的测试开发工程师的时候&#xff0c;灵魂拷问三小…

NIO非阻塞式网络通信实例

一、概述 1、NIO有三大核心部分&#xff1a;Channel(通道)&#xff0c;Buufer(缓存区)&#xff0c;Selector(选择器) Buffer缓存区 缓冲区本质上是一块可以写入数据&#xff0c;然后可以从中读取数据的内存。这块内存被包装成NIO Buffer对象&#xff0c;并提供了 一组方法&am…

❤Linux文件、目录与磁盘格式总结❤

文章目录 Linux文件、目录与磁盘格式总结Linux文件权限chgrpchmodchown文件种类Linux文件扩展名 Linux文件与目录管理常用的目录解释目录树绝对路径与相对路径cd(切换目录)pwd(显示当前目录)mkdir(建立一个新目录)rmdir(删除空目录)执行文件路径变量$PATHls(文件与目录的查看)c…

青藤首提“业安融合”理念,正式发布先进云安全方案CNAPP

4月18日&#xff0c;以“云时代&#xff0c;安全变了”为主题的2023年云安全高峰论坛在北京举行。会上&#xff0c;青藤首次提出“业安融合”理念&#xff0c;正式发布先进云安全方案CNAPP。 中国全面进入云和数字化时代 当前&#xff0c;全球已进入数字经济时代&#xff0c;…

物联感知产品如何助力企业实现智能化转型?

如果您的企业想要实现设备全生命周期管理、设备信息管理、设备监控和数据处理等功能&#xff0c;想要进行智能化数字转型&#xff0c;不妨了解一下物联感知。 物联感知产品是利用物联网技术&#xff0c;实现对物理世界的感知、联接和智能化。物联感知产品一般由四个部分组成&a…

python中的pyc文件了解一下?

基本说明 pyc 文件是 Python 编译过的字节码文件。当你运行一个 Python 程序时&#xff0c;Python 解释器首先将源代码&#xff08;通常是 .py 文件&#xff09;编译成字节码。这个字节码是一种低级的、与平台无关的代码&#xff0c;它可以被 Python 虚拟机&#xff08;Python…

TCP的连接管理机制(三次握手与四次挥手)

目录为啥要三次握手与四次挥手三次握手syn 与 ack三次握手具体流程四次挥手注意为啥要三次握手与四次挥手 相比于UDP, TCP是有连接的, 这个连接就体现在这了. 三次握手就是TCP建立连接, 四次挥手就是TCP断开连接. 三次握手 握手是指通信双方进行网络交互. 三次握手就相当于…

记录上传文件异常 /tmp/tomcat... (No space left on device)

一&#xff0c;问题描述 用postman调用上传接口&#xff0c;基本每两次调用会有一次报错&#xff0c;如下 {"timestamp": "2023-04-11T03:00:15.4690000","status": 500,"error": "Internal Server Error","exceptio…

【活动】想对大学的自己说……

写在前面&#xff1a; 时间过得真的很快&#xff0c;眨眼间我们已经走过了这么多年的大学时光。回想起来&#xff0c;我们曾经有过无数的欢笑和泪水&#xff0c;有过无数的成功和挫败&#xff0c;但是这些经历都让我们变得更加坚强和成熟。如果现在有机会回到大学时光&#xff…

【LInux】进程间通信 -- 匿名管道

前言 我们在学习进程管理&#xff0c;进程替换时&#xff0c;都强调了进程的独立性&#xff0c;那进程间通信是什么&#xff1f;这好像和进程的独立性相矛盾吧&#xff1f; 那么今天&#xff0c;我们就来学习进程间通信&#xff0c;和第一种通信方式 – 管道 文章目录 前言一. …

高效管理 Linux 进程:如何后台执行程序、查看进程、终止任务

目录 前言一、nohup命令详解1-1、nohup命令介绍1-2、语法格式1-2-1、基础语法介绍1-2-2、执行脚本文件1-2-3、执行python文件1-2-4、拓展延申&#xff1a;在服务器上运行后台进程1-2-5、nohup和&的区别 二、进程查看2-1、jobs命令&#xff08;基本不用&#xff09;2-2、ps命…

Android进阶宝典—在Compose中跳转Fragment

使用场景 我们原有的项目中基本采用的是单Activity架构&#xff0c;页面之间的跳转都是通过Navigation进行的&#xff0c;举个简单的例子。 在这种单Activity架构模式下&#xff0c;有一天我们想把MainActivity或者BFragment使用Compose重构&#xff0c;这个时候我们就需要去…

PasteSpider软件优势介绍

PasteSpider采用.netcore编写&#xff0c;运行于linux服务器的docker/podman里面&#xff0c;涉及的技术或者工具有podman/docker,registry,nginx,top,ssh,git,svn等。 PasteSpider可以更好的为你执行服务的升级和维护工作。支持集群模式安装&#xff0c;也支持单例模式运行。…

如何为 Apple 官方 SwiftUI 示例中的图表元素加上首显动画?

0. 概览 在 Apple 官方教程示例 Animating Views and Transitions 中,苹果为我们展示了如何为 SwiftUI 中的各种视图添加动画和过渡效果。 在示例的最后,我们在完成 3 种不同数据类型(Elevation, Heart Rate, Pace)切换的同时,顺面收获了美美的图表元素动画效果: 不过,…

科研方向与个人思考

文章目录 关于科研选题与方法的若干思考如何选题选题tips确定研究问题之后如何读论文——与一篇优秀论文作者的博弈阅读论文的技巧代码实现过程中成果发表四步走&#xff1a;科技论文的书写顺序学会利用工具科研的正确姿势 研究生时间线个人思考入门一个领域的步骤&#xff08;…

【有功-无功协调优化】基于改进多目标粒子群优化算法(小生境粒子群算法)的配电网有功-无功协调优化研究(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

Windows 安装 GDAL C++库

Windows 安装 GDAL C库1. 方法1&#xff1a;下载配置网友编译的GDAL版本1.1 下载1.2 配置1.3 测试1.4 缺点2. 方法2&#xff1a;自己编译3. 参考1. 方法1&#xff1a;下载配置网友编译的GDAL版本 1.1 下载 CSDN: GDAL&#xff0c;geos联合编译的库&#xff0c;版本为1.8.0&am…