[C++基础] 命名空间namespace的了解和使用

[C++基础] 命名空间namespace的了解和使用,第1张

[C++基础] 命名空间namespace的了解和使用

目录
  • 命名空间 namespace
  • 命名空间的定义

命名空间 namespace
#include

int rand = 0;

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

上述代码一定会出现以下情况:

原因: 自己定义的rand变量为某一库函数里面已经声明过的函数,意思就是你自己定义的东西跟库函数的东西重复了。这种错误就是命名冲突。

命名冲突问题:

  1. 我们自己定义的变量、函数可能跟库里面重名冲突。
  2. 进入公司项目组后,做的项目通常比较大,多人协作,可能命名冲突。
    C语言没有办法很好的解决这个问题。
    C++提出了一个新语法:命名空间
命名空间的定义

对于上面的问题我们使用命名空间来解决:

#include

namespace zzy
{
	int rand = 0;
}

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

我们使用namespace来划定一个区域,叫做域,域的名字叫zzy(名字可以自己定义,但是最好不要跟库已有的重复)。这个域就像是隐身衣一样,让系统编译的时候不会去这个区域里面读取。

:: 为域作用限定符,前面是命名空间的名称,后面是命名空间里的变量、类型、函数等。使用这个限定符来指定我们使用的是哪个命名空间里的变量

需要注意的一点是,命名空间是全局的,必须要写在main函数的外边。

下面举些例子来帮大家更清晰的了解命名空间:
1. 函数定义在命名空间里

#include
namespace zzy
{
	int Add(int x, int y)
	{
		return x + y;
	}
}

int main()
{
	printf("%dn", zzy::Add(1, 2));
	return 0;
}

如果把函数的定义写在命名空间的外面,而函数声明在命名空间里面会怎么样?由于命名空间会屏蔽掉,相当于你没有写这个声明。但是如果你的函数定义写在main函数的上面就没什么问题了。

#include
namespace zzy
{

	int Add(int x, int y);
}

int Add(int x,int y)
{
	return x+y;
}

int main()
{
	printf("%dn",Add(1, 2));
	return 0;
}

一点要注意,这个时候你不可以写zzy::了,因为如果你这么写的话系统会优先去zzy命名空间里去寻找,发现只有函数的声明,没有函数的定义,所以是没结果的。

2.对全局变量使用命名空间

#include 
int a = 0;

int main()
{
	int a = 10;
	printf("%d",::a);//使用全局作用域的a,::前面的没有东西代表全局作用域
}

3.命名空间的嵌套

#include 
namespace zzy
{
	int a = 10;
	namespace N1
	{
		int b = 20;
	}
}

int main()
{
	printf("%dn",zzy::a);
	printf("%dn",zzy::N1::b);
}

4.using命名空间
我们发现,每次使用一些命名空间里的变量总是要加上”命名空间名称::”,当变量多时,就会显得很繁琐。所以我们可以这么做:

#include 
using namespace zzy
{
	int count = 12;
	int Add(int x,int y)
	{
		return x+y;
	}
}

//解放了整个zzy空间,使里面的变量等变得不隐身了
using namespace zzy;

int main()
{
	printf("%d",count);
	printf("%d",Add(1,2));
}

也可以解放一部分变量、函数等:

#include 
using namespace zzy
{
	int count = 12;
	void B()
	{
		int cur = 0;
	}
}

//只解放了一部分变量
using zzy::B::cur;

int main()
{
	printf("%d",zzy::count);
	printf("%d",cur);
}

5.命名空间里的结构体

#include 

using namespace zzy
{
	int count = 0;
	struct Node
	{
		int val = 0;
	};
}

int main()
{
	struct zzy::Node node;//注意::的位置,我们要找的是Node
	node.val = 12;
	printf("%dn", node.val);
}

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5578641.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-14
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存