C++中的命名空间namespace
定义
C++中的命名空间规定了变量、函数、类的作用域。在命名空间下的所有代码都属于该命名空间,都要受该命名空间的控制。
namespace 名称{
变量;
函数;
类;
......
}
到底啥叫命名空间呢?
也许你经常会看到C++代码中总是有这样一句(或者你经常会写上这么一句代码,但自己不太懂啥意思):
using namespace std;
然后经常写这这样的语句:std::cout<<" "<<std::endl;这个std就是一个命名空间!!!
C++中的命名空间到底有啥用呢?
假如我们以后做项目时,可能需要链接第三方的库文件,那么是不是就很有可能我们自己起的名字就有可能和别人的冲突,在以往的C语言中,我们可以将一些类的名字起的复杂一些解决这些问题,但是也还是无法完全避免,所以为了避免这种冲突,C++就引入了命名冲突这种机制,解决命名冲突的问题。
比如,我们有三个类,都叫Person类(模拟可能以后别的库文件会和你的命名冲突)
- 第一个Person类,写在类中(有.h/.cpp文件)
Person.h文件
namespace XHB {
class Person
{
public:
Person();
~Person();
int m_age;
};
}
Person.cpp文件
namespace XHB {
Person::Person()
{
std::cout << "Person::Person()" << std::endl;
}
Person::~Person()
{
}
}
这里要注意一点,声明中被命名空间包围,实现中也要被命名空间包围,即所有的代码都要在namespace下
- 其余两个Person类在main.cpp里
class Person
{
public:
int m_age;
};
namespace ZMM {
class Person
{
public:
int m_age;
};
}
上面我们定义了三个Person类,类中都有m_age这个成员,乍一看会冲突。但是C++的命名空间可以完美的解决这个问题。下面main函数中调用这些相同名字的类,如何使用命名空间避免冲突
int main()
{
Person person1;
ZMM::Person person2;
XHB::Person person3;
person1.m_age = 10;
person2.m_age = 20;
person3.m_age = 30;
getchar();
return 0;
}
这三个m_age是不同的变量,这都是命名空间的作用,可以让相同的类名、相同的变量名之间不冲突。
放在命名空间里的全局变量依然是全局变量
虽然把全局变量放在了括号里,可能会误认为在栈空间,但是仍是在全局区。命名空间里的东西只是作用域变了,但是以往的内存分配仍然不变。
namespace ZMM {
char *p = NULL;//虽然被括号包围,但是依然是全局变量
void function();
class Person
{
public:
int m_age;
};
}
int main()
{
ZMM::Person person2;
ZMM::p = &person2.m_age;//调用命名空间下的变量,也必须要用ZMM::控制
ZMM::function();//调用函数也是如此
getchar();
return 0;
}
所有的C++代码都被一个默认的命名空间包围着
这个命名空间没有名字,却包围着所有的东西,比如下方的代码一样。所以所有的变量、函数、类、甚至是命名空间都在这个命名空间下。‘::’可以放在任何代码的前面。
ZMM::Person person2;
::ZMM::Person person2;
ZMM::function();
::ZMM::function();
两行代码意义相同!!!!
总结
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。有了命名空间,就可以避免命名冲突问题,在后续项目开发中要多留意这个功能。