对c++中namespace的理解
1.namespace是什么
在c++中,namespace是命名空间,是为了防止出现同名冲突,比如变量名同名,方法名同名等,程序开发者可以自定义命名空间,在不同的命名空间里可以定义相同名字的方法,与函数重载不同,不同命名空间里面的方法甚至形参类型和个数也可以相同。
namespace test
{
void p()
{
std::cout<<"Hello C++"<<endl;
}
}
namespace test1
{
void p()
{
std::cout<<"Hello World"<<endl;
}
}
int main()
{
test::p();
test1::p();
return 0;
}
输出结果为
Hello C++
Hello World
可以大概将C++中的namespace理解成python里的第三方库,java里的软件包,我们可以在namespace中定义独特的变量,类,方法等。
2.如何使用namespace
namespace是用来防止命名冲突的,假设有两个库定义了一个 log()函数:
// 来自网络库(network_lib)
void log(const char* msg) { /* 网络日志 */ }
// 来自数学库(math_lib)
void log(double value) { /* 数学计算日志 */ }
如果不做隔离,编译器无法区分该调用哪个 log(),导致重定义错误。为了解决这个问题,我们将不同库的内容放入独立的命名空间:
namespace network {
void log() { /* 网络日志 */ }
}
namespace math {
void log() { /* 数学日志 */ }
}
在使用时,只需要加上命名空间的前缀即可:
network::log(); //调用network里的log方法
math::log(); //调用math里的log方法
3.如何优雅的使用命名空间
①使用::前缀
network::log(); //调用network里的log方法
math::log(); //调用math里的log方法
这种方法的有点是代码可读性比较强,但是代码比较冗长。
②使用using关键字
#include<iostream>
int main()
{
using namespace std;
cout<<"hello"<<endl; //代替了std::cout<<"hello"<<endl;
using namespace network;
log(); //直接调用network里面的log()函数
}
这种方法是可以减少代码的冗余,也限制了作用域,可以防止全局污染。

浙公网安备 33010602011771号