不同商家的相同货品,你要哪个?这可能就是命名空间的解释。
常见的std::string中std就是命名空间。
#include <iostream>
#inclued <string>
void ptintf(int a)
{
std::cout<<"I like"<<a<<std::endl;
}
void ptintf(int a)
{
std::cout<<"I don't like"<<a<<std::endl;
}
int main()
{
printf(4);
std::cin.get()
}
上面的代码显然无法运行,因为main不知道你想要的是哪个printf函数。可能你会想到类中重载函数,但是在这里我们看到输入参数是一样的,我们无法使用重载。那应该怎么办呢?对其命名。
#include <iostream>
#inclued <string>
namespace like{
void ptintf(int a)
{
std::cout<<"I like"<<a<<std::endl;
}
}
namespace nlike{
void ptintf(int a)
{
std::cout<<"I don't like"<<a<<std::endl;
}
}
int main()
{
like::printf(4);
std::cin.get();
}
命名空间就是两家不同的店铺,你可先用商家名再拿商品。
还有一件事只有一个命名空间时可不可以省略命名空间?方法是有的using namespace std
这样我们在本文件内从std命名空间的引用就可以省略了。
#include <iostream>
#inclued <string>
using namespace std;
namespace like{
void ptintf(int a)
{
cout<<"I like"<<a<<endl;
}
}
namespace nlike{
void ptintf(int a)
{
cout<<"I don't like"<<a<<endl;
}
}
int main()
{
like::printf(4);
cin.get();
}
想要省略其他的命名空间只要将std替换名称即可。
不建议使用using namespace 因为你会难以区分c++自带的函数与你自己编写的函数,会为自己以后带来阅读困难。
让我们来看以下的代码
#include <iostream>
#inclued <string>
namespace like{
void ptintf(int a)
{
std::cout<<"I like"<<a<<std::endl;
}
void likeBetter(int i)
{
std::cout<<"I like"<<i<<std::endl;
}
}
namespace nlike{
void ptintf(int a)
{
std::cout<<"I don't like"<<a<<std::endl;
}
}
int main()
{
using namespace like
printf(4);
likeBetter(8);
std::cin.get();
}
在代码中我们使用了like空间下的两个函数喜欢4更喜欢8。如果printf是nlike空间下的呢?两种方式。
int main()
{
using namespace like
nlike::printf(4);
likeBetter(8);
std::cin.get();
}
int main()
{
using namespace like
using nlike::printf;
printf(4);
likeBetter(8);
std::cin.get();
}
第一种是说明用nlike下的printf 只针对这一个。
第二种是针对main函数中所有的printf都使用nlike下。
这就是命名空间以及特点。