【C++】命名空间注意点

初次见面----命名空间

观察下列两种代码,有什么不同?

#include <iostream>
//using namespace std;
int main()
{
	std::cout << "HEllow World!" << std::endl;
	return 0;
}

在这里插入图片描述


#include <iostream>
using namespace std;
int main()
{
	//std::cout << "HEllow World!" << std::endl;
	cout << "HEllow World!" << endl;
	return 0;
}

在这里插入图片描述
显而易见上面的不同点就在于是否包含using namespace std; So这行代码是干什么的?


什么是命名空间

需要弄清楚上面的问题,就需要知道命名空间的相关知识

简单来说就是将同一作用域的变量、函数、类用一个自定义的空间名字区分。

namespace zxy
{
	int x = 0;
	int Swap(int* p1, int* p2)
	{
		int temp = *p1;
		*p1 = *p2;
		*p2 = temp;
	}
	struct LinkList
	{
		int val;
		struct LinkList* next;
	};
}

全局变量、函数、类可以放在一个叫做zxy的空间,这个空间的名字由你决定。

命名空间的写法:

namespace+自定义的空间名字


为什么出现命名空间

同一个作用域出现重名变量或者函数

#include <iostream>
using namespace std;

void Swap(int* p1, int* p2)
{
	int temp = *p1;
	*p1 = *p2;
	*p2 = temp;	
}

int Swap = 110;

int main()
{
	cout << Swap << endl;
	return 0;
}

在这里插入图片描述


或者变量名称和库中的函数重名

#include <iostream>
#include <stdlib.h>

using namespace std;

int rand = 10;

int main()
{
	cout << rand << endl;
	return 0;
}

在这里插入图片描述


解决方案:

针对上述的情况发生,C++中引入命名空间的概念

#include <iostream>
#include <stdlib.h>

using namespace std;

namespace zxy
{
	int x = 0;
	int rand = 1;
	int Swap(int* p1, int* p2)
	{
		int temp = *p1;
		*p1 = *p2;
		*p2 = temp;
	}
	struct LinkList
	{
		int val;
		struct LinkList* next;
	};
}

int main()
{
	cout << rand() << endl;
	return 0;
}

这样我们就可以使用重名的变量或者函数


命名空间的三种表达方式

使用 域作用限定符 ::

#include <iostream>

using namespace std;

namespace zxy
{
	int x = 3; 
	void Swap(int* p1, int* p2)
	{
		int temp = *p1;
		*p1 = *p2;
		*p2 = temp;
	}
	struct LinkList
	{
		int val;
		struct LinkList* next;
	};
}

int x = 101;


int main()
{
	cout <<  "zxy::x = " << zxy::x << endl;
	return 0;
}

在这里插入图片描述


使用部分展开

#include <iostream>

using namespace std;

namespace zxy
{
	int x = 3; 
	void Swap(int* p1, int* p2)
	{
		int temp = *p1;
		*p1 = *p2;
		*p2 = temp;
	}
	struct LinkList
	{
		int val;
		struct LinkList* next;
	};
}

int x = 101;
//部分展开,针对个人需要的变量或者函数展开
using zxy::Swap;
int main()
{
	int x = 10;
	int y = 20;
	Swap(&x, &y);
	

全部展开

#include <iostream>

using namespace std;

namespace zxy
{
	int x = 3; 
	void Swap(int* p1, int* p2)
	{
		int temp = *p1;
		*p1 = *p2;
		*p2 = temp;
	}
	struct LinkList
	{
		int val;
		struct LinkList* next;
	};
}

int x = 101;
//将命名空间里面定义的内容取消“限制”
using namespace zxy;
int main()
{
	int x = 10;
	int y = 20;
	Swap(&x, &y);
	return 0;
}

但是全部展开是由一定风险的,比如上面的全部展开代码,我们发现全部展开之后会出现两个同名变量x
在这里插入图片描述


命名空间合并

同一个工程中允许存在多个相同名称的命名空间,编译器最后会合成同一个命名空间中

#include <iostream>

using namespace std;

namespace zxy
{
	int x = 3; 
	void Swap(int* p1, int* p2)
	{
		int temp = *p1;
		*p1 = *p2;
		*p2 = temp;
	}
	struct LinkList
	{
		int val;
		struct LinkList* next;
	};
}

namespace zxy
{
	int a = 101010;
}

int main()
{
	int a = 101;
	cout << zxy::a << endl;
	return 0;
}

命名空间的定义可以是不连续的,标准命名空间std也不例外,std的定义被分散在多个头文件里2,比如标准输入/输出头文件 <iostream>中就定义了一个标准命名空间,<iostream>里面的函数或类被放在std命名空间中,比如cin和cout这两个函数的名字就放在命名空间std里面,如果我们想使用cout函数,那就必须使用std命名空间引入这个函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值