【命名空间】using namespace std是什么意思?

本文介绍了C++中的命名空间概念,旨在解决变量名冲突问题,提供了一种本地化标识符名称的方法。作用域分解运算符`::`用于访问特定作用域内的成员。此外,详细讲解了如何使用`usingnamespacestd`简化标准库的引用,但同时也可能引发命名冲突。建议在大型项目中谨慎使用`usingnamespacestd`,以免影响代码的清晰性和可维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、 前言

 C++中的using namespace std是什么意思呢?为了理解其中的含义,我们首先需要学习一个概念叫做命名空间
 我们都知道,C语言规定变量名不能与关键字冲突,但是并没有规定变量名不能与库中的变量名冲突,但这在实际的操作的过程中就会产生意想不到的错误:
 例如,将一个time变量放在main函数中,根据局部优先的原则,time变量就会被理解为一个局部变量。但当time作为一个全局变量出现的时候,由于time库中也含有一个名叫time的函数名,头文件被展开后,此time被理解为变量名还是函数名就会产生歧义。
在这里插入图片描述
 而C++中出现的命名空间概念就是为了填C语言中的这个坑。

✪总结:同一个域中不能出现两个重名的变量名/函数名,而命名空间的提出就是为了对标识符的名称进行本地化,以此解决命名污染的问题,其作用就是定义一个新的作用域


二、作用域分解运算符

 在讲命名空间的时候首先给大家介绍一个作用域分解运算符 " :: "

✪使用说明
  A,B表示两个类,而在A,B中都有成员member

  • A :: member表示类A成员中的member
  • B :: member表示类B成员中的member

当前面的类不指定的时候,默认为全局

 前面说到变量名冲突的时候遵循局部优先原则,那么我们能不能就想访问到全局变量呢?我们就可以通过作用域分解运算符实现:
在这里插入图片描述


三、命名空间使用介绍
namespace ns
{
	int time = 10;
}

int main()
{
	printf("%d", ns::time);
}

✪基本介绍①

  • namespace 是一个 C++ 中的一个关键字
  • 我们将变量定义在自己创建的一个名为 ns 的命名空间,以避免被污染
  • 访问命名空间中的变量,需要使用作用域分解运算符
  • 命名空间只能定义在全局,其中定义的变量为全局变量
namespace ns
{
	int time = 10;

	typedef struct Stu
	{
		char name[10];
		int age;
		int score;
	}Stu;
	
	namespace func
	{
		int Add(int a, int b)	
		{
			return a + b;
		}
	}
	
}

int main()
{
	ns::Stu data = {0};
	int ret = ns::func::Add(1, 2);
}

✪基本介绍②

  • 从上面我们可以看到命名空间中过的内容不只局限于变量名,也可以是函数名,类型名
  • 命名空间可以无限次嵌套命名空间,同样的使用里面的内容的时候也需要多次使用作用域分解运算符:一层一层相互对应。使用嵌套命名空间可以解决命名空间内部的命名冲突
  • 一个工程中同名的命名空间最终会被合并为一个命名空间

 当然我们可以看到,每次要使用命名空间中的变量都需要写很多额外的内容,有没有什么办法可以简化操作呢?我们想要访问命名空间中的 space_b 有两种方法:

namespace space_a
{
	int a1 = 1;
	int a2 = 2;
	namespace space_b
	{
		int b1 = 10;
		int b2 = 20;
		int b3 = 30;
	}
	namespace space_c
	{
		int c1 = 5;
		int c2 = 6;
	}
}
using namespace space_a;
using namespace space_b;

方法①:首先将 space_a 中的内容全部释放出来,再释放其中的 space_b 的内容(注意顺序不能颠倒,否则 space_b 认不出来)

using namespace space_a:: space_b;

方法②用什么放什么。只是将 space_b 中全部的内容释放出来,而不会对其他的内容产生影响。

释放出来之后我们便可以愉快自由的使用了:
在这里插入图片描述


四、using namespace std

 经过上面的学习,我们不难理解using name std的作用是释放std命名空间中的变量名,函数名以及类型名,其中 std 是C++标准库的命名空间。

 我们在书写代码的时候为了方便于是将C++标准库中的命名空间完全展开了,这在日常使用中当然也没什么大问题,但是在编写大型项目的过程中就容易发生冲突了,所以我还是推荐用什么释放什么,或者带着 :: 来明确指定变量是来自哪个 namespace 的

 另外,标准C++库中提供两种头文件,前面以C开头的头文件是支持命名空间的,而后者是不支持的。例如 <cassert> 支持命名空间,而 <assert.h> 并不支持
在这里插入图片描述

评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

罅隙`

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

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

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

打赏作者

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

抵扣说明:

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

余额充值