定义
在C++中,命名空间(Namespace)是一个特性,用于封装代码并避免名称冲突。命名空间可以看作是一个容器,其中可以包含类、函数、变量、常量、其他命名空间等。通过使用命名空间,我们可以更好地组织代码,提高代码的可读性和可维护性。
命名空间的格式
命名空间通过关键字namespace
进行定义。例如:
namespace MyNamespace {
int x = 0;
void foo() {
// ...
}
}
其中, namespace_name
是命名空间的名称,使用大括号 {}
将其中的元素定义放置在该命名空间内。 其中的声明可以是任何声明语句,如变量、函数或其他命名空间等。在这个例子中,MyNamespace
是一个命名空间,它包含了一个整数变量x
和一个函数foo
。
使用命名空间
要在代码中使用命名空间中的元素,我们需要指定命名空间名称。例如:
MyNamespace::x = 10;
MyNamespace::foo();
命名空间别名
为了简化代码,我们可以使用using
关键字为命名空间创建别名。例如:
using namespace MyNamespace;
x = 20;
foo();
命名空间的嵌套
命名空间可以嵌套,即一个命名空间可以包含另一个命名空间。例如:
namespace Outer {
int y = 100;
namespace Inner {
void bar() {
// ...
}
}
}
在这个例子中,Outer
是一个命名空间,它包含一个整数变量y
和一个嵌套的命名空间Inner
。Inner
命名空间包含了一个函数bar
。
标准命名空间
在C++标准库中,所有的函数、对象和类型都被定义在一个名为std
的命名空间中。因此,当使用C++标准库时,我们通常需要使用std::
前缀,或者通过using namespace std;
来使用标准库中的元素。
两个命名空间包含同样的函数(函数体形参也是一样)
当两个命名空间包含同样的函数(函数体形参也是一样)的时候。
1:别的地方引用的时候,如果不包含对应的命名空间,编译会报错函数未定义。
2:如果别的源文件包含了两个命名空间的头文件,并且写using namespace XXX; 声明引用了两个命名空间,程序也会报错,call of overloaded ‘function(args...)’ is ambiguous,编译器不知道使用哪一个,所以在调用对应的函数前面要加上对应的命名空间名称 XXX::API();
总结
命名空间是C++中一个非常有用的特性,它可以帮助我们更好地组织代码,避免名称冲突,并提高代码的可读性和可维护性。通过合理地使用命名空间,我们可以使代码更加清晰、易于理解和维护。
示例
namespace.cpp
#include "namespace.h"
namespace mystd
{
int myadd(const int a,const int b)
{
return a+b;
}
}
namespace mystd
{
int myAdd2(const int a,const int b)
{
return a+b*2;
}
}
namespace.h
#ifndef ___NAMESPACE__H
#define ___NAMESPACE__H
namespace mystd
{
int myadd(const int a,const int b);
int myAdd2(const int a,const int b);
}
#endif
main.cpp
#include<iostream>
#include"namespace.h"
using namespace mystd;
int main()
{
int sum=mystd::myadd(10,20);
std::cout<<sum<<std::endl;
sum=mystd::myAdd2(10,20);
std::cout<<sum<<std::endl;
return 0;
}
编译运行:
1:声明和定义都要加上自己定义的namespace 名字{}
2:同一个namespace 名字{}可以在多处使用