C++中的命名空间规定了变量、函数、类的作用域。在命名空间下的所有代码都属于该命名空间,都要受该命名空间的控制。
namespace 名称{ 变量; 函数; 类; ...... }
也许你经常会看到C++代码中总是有这样一句(或者你经常会写上这么一句代码,但自己不太懂啥意思):
using namespace std;
然后经常写这这样的语句:std::cout<<" "<<std::endl;这个std就是一个命名空间!!!
假如我们以后做项目时,可能需要链接第三方的库文件,那么是不是就很有可能我们自己起的名字就有可能和别人的冲突,在以往的C语言中,我们可以将一些类的名字起的复杂一些解决这些问题,但是也还是无法完全避免,所以为了避免这种冲突,C++就引入了命名冲突这种机制,解决命名冲突的问题。
比如,我们有三个类,都叫Person类(模拟可能以后别的库文件会和你的命名冲突)
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下
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; }
这个命名空间没有名字,却包围着所有的东西,比如下方的代码一样。所以所有的变量、函数、类、甚至是命名空间都在这个命名空间下。‘::’可以放在任何代码的前面。
ZMM::Person person2; ::ZMM::Person person2;
ZMM::function(); ::ZMM::function();
两行代码意义相同!!!!
注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。有了命名空间,就可以避免命名冲突问题,在后续项目开发中要多留意这个功能。