命名空间namespace
命名空间的作用:使用命名空间的目的是对标识符的名称进行本地化, 以避免命名冲突或名字污染。
在同一个域中不能有两个同名的定义,存在就会出现冲突报错,用namespace创建不同的命名空间域可以避免这个问题。
1.1.命名空间的定义
namespace YGH //YGH为自定义的空间名
{
//命名空间的成员,可定义变量、函数、类型
}
创建命名空间域,只内部成员的影响使用,不影响生命周期。
命名空间可以嵌套使用。
如果多个命名空间定义的名字相同,编译器会合并认为是一个命名空间,若此时命名空间中出现同名定义,依旧会出现冲突。此时只能修改命名空间的名字或者再嵌套一层命名空间。
一个命名空间就定义了一个新的作用域,其中的所有内容都局限在这个作用域中。
1.2.命名空间的使用
使用命名空间的方法有三种:
指定命名空间访问:就是普通的在前面使用操作符 ::
int main()
{
printf("%d\n", YGH::a);
return 0;
}
全局展开:是直接使用using namespace A;(A为自定的命名空间名),因为默认不会在命名空间中搜索,加了using namespace以后就会去搜索。一般情况下不建议全局展开,因为展开后就相当于没有建立命名空间了。
using namespce YGH;
int main()
{
printf("%d\n", a); //a定义在命名空间YGH中
return 0;
}
部分展开:using struct Node A,意思是将A中的strect Node这一部分展开出来,用这一部分时不用::,相当于将struct Node放在全局,但是这样做就不能在全局定义和它同名的定义了。
using YGH::b;
int main()
{
printf("%d\n", N::a);
printf("%d\n", b); //部分展开b,可以不用::
return 0;
}
命名空间嵌套定义时使用的方法为 YGH1::YGH2::定义内容,意思是在YGH1命名空间中找YGH2,然后在YGH2命名空间中找自己定义的内容。
int main()
{
printf("%d\n", YGH1::YGH2::a);
return 0;
}
总结:
全局展开一般在自己练习的时候使用,实际工程中不能使用。
指定命名空间访问和部分展开可以用于实际开发。
1.2.1.命名空间使用例
______________________________
Node.h
______________________________
namespace YGH //YGH为命名空间名称,自定义
{
//命名空间域
struct Node
{
struct Node* next;
int val;
};
}
______________________________
Node.cpp
______________________________
#include"Node.h"
int main()
{
struct A::Node node1; //使用::找到并使用命名空间域A中的结构体
return 0;
}
1.3.std命名空间的使用
std是C++标准库的命名空间。
使用方法:
1. 在日常练习中,建议直接using namespace std即可。
2. using namespace std展开,标准库就全部展开了,如果我们定义跟库重名的类型、对
象、函数,就存在冲突问题。该问题在日常练习中很少出现,但是项目开发中代码较多、规模
大,就很容易出现。所以建议在项目开发中使用,像std::cout这样使用时指定命名空间 +
using std::cout展开常用的库对象/类型等方式。