ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2022-01-24 20:33:02  阅读:164  来源: 互联网

标签:ZMM age namespace 空间 Person C++ 命名


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

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

总结

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

标签:ZMM,age,namespace,空间,Person,C++,命名
来源: https://blog.csdn.net/weixin_45452278/article/details/122672754

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有