C++命名空间

命名空间是C++为解决命名冲突问题而引入的机制,它允许在特定域内定义变量和函数。创建命名空间使用`namespace`关键字,访问命名空间可通过`using`关键字全部展开或使用域限定符。若两个命名空间同名,它们会自动合并。在实际编程中,展开单个常用函数可以提高效率。
摘要由CSDN通过智能技术生成

前言

在C中,不知道你有没有这样的苦恼,在一个项目当中有多个文件,每个文件内部都没有问题,但是一但整合在一起,就会有命名冲突的报错,或者你的一个变量是和一个几乎用不上的库函数名冲突,导致的报错,这种报错往往在一些大项目中让人头大,因为在这些代码量较多的项目中,这个变量名不可能只出现一次,改起来会很麻烦,那应该怎么办呢?提前商量好谁用那些吗?这在工程中是不现实的,那这个时候C++的创始人本贾尼大佬就想出了一种解决方案,将他添加到了C++中,这个解决方案就是命名空间

什么是命名空间?

命名空间实质上也是一种域,在域内,我们可以定义只属于我们自己的变量,通过域限定符来访问我们自己的这个变量。

怎么创建命名空间?

创建命名空间需要一个关键字namespace,具体的创建如下面代码所示:

namespace test//空间名的名字
{
	//成员
}

如何访问命名空间?

访问命名的空间的方法有三种:

1.全部展开

第一种是全部展开,需要用的一个关键字using,用using namespace 命名空间空名就可以直接展开这个命名空间,如在日常写一些题的时候,使用C++都会带一句using namespace std;而不带这一句的时候,虽然使用函数之前引了头文件,但是还是会报错,是未声明的标识符,这个时候在这个函数之前加std::,就可以了,这是为什么?后面加的std::是指定了这个函数在哪个命名空间内查找,std(C++标准库)是这个命名空间的名字,::是域限定操作符,那再前面加了using namespace std就不需要指定去std中找,就可以找到,这是为什么?是因为写了这句话的意思是展开std,std内部的所有成员变成全局的,这也变相的说明了,如果我们不展开或者不限定去哪个命名空间访问,编译器就不会去这个命名空间内查找

2.域限定符

再全部展开的讲解中,提到了域限定符的使用,那这也是我们的一种方法, 是符合我们的全部场景的,也是未来再工作中会用到最多的方法。

3 .展开单个

在实际的写项目过程中全部展开符合我们的要求吗?很明显在某些场景下是不符合的!我们用命名空间的目的是什么?是为了让我们的成员名不和其他人冲突或者和库内的函数名冲突,那全部展开就和没有一样,那再哪些场景下是可以的呢?再日常写代码练习的场景下是可以的,那对于使用频繁的函数,如cin、cout这些函数的时候,要一直加std::吗?这样会很麻烦,那有没有什么办法呢?这个时候就可以展开单个,具体操作如下:

using std::cin;
using std::cout;

这个就是展开了单个,对于使用频繁的函数可以采用此方法。

注意

1.如果两个命名空间名字相同怎么处理?

如果再这个时候出现了两个名字相同的命名空间,编译器会怎么处理?

namespace test//空间名的名字
{
	int a;
}

namespace test
{
	int a;
}

在这里插入图片描述

报错是变量a重定义,而不是命名空间重定义,说明了,两个或者多个相同名字的命名空间会自动合并成一个。

2.如果命名空间内嵌套一个命名空间会怎么样?

这个再后面工作的项目当中是常见的,嵌套使用是可以的,可以将有部分作用一样的放在一起,当出错的时候,也可以直接定位到是哪个命名空间当中。


🙉都看到这里了,留下你们的👍点赞+⭐收藏+📋评论吧🙉

  • 8
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封心锁爱的前夫哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值