C++学习之路—命名空间namespace

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();

两行代码意义相同!!!!

总结

注意:一个命名空间就定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中。有了命名空间,就可以避免命名冲突问题,在后续项目开发中要多留意这个功能。

上一篇:UVA11462 Age Sort


下一篇:Rust结构体关联函数