C++namespace命名空间理解
前言
初学C++,第一个关键字namespace理解
为了解决程序员与标准库命名冲突问题,C++使用了namespace关键字
一、namespace是什么?
项目开发,项目分解很多小组,小组分解很多组员,每个程序员都会有自己的代码风格。个人代码写到自己的代码空间里面,不会与其他人的代码命名冲突。
二、举例说明
1.namespace理解
程序分为4个域
1.局部域
2.全局域
3.命名空间域
4.类域
下面先理解,局部域和全局域
#include <iostream>
int cout = 1;
int main()
{
int cout = 2;
printf("%d \n", cout);
printf("%d \n", ::cout);
return 0;
}
不指定域:代码搜索原则 局部域 全局域(找不到报错)
指定域 :直接到指定域搜索
上面打印结果是,2 和1
因为编译器先搜索局部域,后全局域。
::是域作用限定符
如果只有::(左边空着),就是指定的全局域,是除了局部域、命名空间域、类域以为的域。
2.namespace命名std理解
程序分为4个域
1.局部域
2.全局域
3.命名空间域
4.类域
#include <iostream>
int main()
{
std:: cout << "hello world" <<std:: endl;
return 0;
}
先理解iostream 头文件,里面使用了宏,定义了namespace std,里面声明了像cout 、cin等关键字。如果使用,程序中要使用std::前缀(不加会报错)。
不指定域:代码搜索原则 局部域 全局域(找不到报错)
指定域 :直接到指定域搜索
#include <iostream>
using namespace std;
int main()
{
std:: cout << "hello world" <<std:: endl;
cout << "hello world" << endl;
return 0;
}
如果使用using namespace std;相当于把std域给打开权限了,编译器会搜索局部域和全局域和命名空间域。也可以指定std::
3.命名空间域和全局域名字冲突怎么办?
#include <iostream>
//#include "test.h"
using namespace std;
namespace bit1
{
int cout = 1;
}
int cout = 0;
int main()
{
printf("%d \n", ::cout);
printf("%d \n", bit1::cout);
std:: cout << "hello world" <<std:: endl;
//cout << "hello world" << endl;
return 0;
}
全局域和命名空间域重命名时,使用时必须指定哪一个域。如果不指定(用屏蔽那一行),会报错,编译器不知道用哪一个。全局域用::
可以理解,命名空间域虽然打开,但是和全局域是相互独立的。全局域和bit1域、std域是一样的,只不过全局域没有命名而已,所以使用时一样要知道用的哪一个域的参数
#include <iostream>
//#include "test.h"
using namespace std;
namespace bit1
{
int cout = 1;
}
int cout = 0;
int main()
{
int cout = 2;
printf("%d \n", cout);
printf("%d \n", ::cout);
printf("%d \n", bit1::cout);
std:: cout << "hello world" <<std:: endl;
//cout << "hello world" << endl;
return 0;
}
命名空间域、局部域、全局域可以重命名。但是全局域和命名空间域必须知道指定哪一个域,否则会报错。
总结
全局域、命名空间域、类域是相互独立的,如果都存在一个工程里面,确认使用的域名,最好不要打开域名(using namespace std;)