C++学习之旅-namespace

C++学习之旅之namespace

1.1 、C++为什么要引入namespace(命名空间)
1.2 、C++的命名空间基本语法和使用
1.3、 C++的默认命名空间
1.4、 C++的匿名命名空间

学习内容:

1.1.、 C++为什么要引入namespace
谈到这个问题,我们就得先来说说namespace的在C++中的作用,namespace命名空间,本质上是通过改变程序代码的作用域而达到改变程序的链接属性。通常C程序的作用域有以下几种:
(1) 代码块儿作用域,譬如:函数体
(2) 文件作用域,譬如:静态全局变量、静态函数
(3) 全局作用域,extern 函数 或者全局变量
它们的作用域相对应的链接属性分别是:
(1)无链接
(2)内链接
(3)外连接
C语言中有这样的规则是因为需求而产生的,也就是说这些规则是为了解决一些问题而产生的,那到底是因为什么问题而要有这些规则呢? 是因为程序一旦变的复杂,变的大型化,就需要分工合作,每个人负责一个模块。这样一来很难保证每个人定义全局变量和函数不冲突。所以C语言程序定义函数和全局变量时,都加固定前缀譬如:STM32HAL库中的每个模块代码都是:HAL_XXX_funcname,将不需要外部使用的函数都加上static 限定作用域。那么,我们回到C++,C++是C的超集,加入了namespace根本上是也是为了解决上述的问题C语言中虽然也有static 等关键字,但是并不能完全解决问题,还需要程序员自己注意。而且,C语言中不能限定类型的作用域。
相信通过上面的说明,大家已经知道为什么C++要加入namespace了。
1.2 、C++的命名空间基本语法和使用
1.2.1、namespace定义

namespace NS1
/*keyword namesapce name*/
{	
	//变量定义
	//函数定义
	//类型
};

1.2.2、调用namespace中函数或者其他

/**
*  常用的调用namespace中的方法
*/
// 定义并声明
namespace NS1
{	
	//变量定义
	int a = 11;
	//函数定义
	void func1(void)
	{
	}
	//类型
	enum e1
	{
		e1_mem1,
		e1_mem2,
	};
};
/* 第二种使用方法 */
using namespace NS1;
int main(int argc, char **argv)
{	
	/* 第一种使用方法 ::是域中作用符 */
	/**
	NS1::func1();
	NS1::a = 2;
	NS1::enum e1 e11; **/
	/* 第二种使用方法 */
	func1();
	a = 2; 
	e1 e11;
}
void func2(void)
{
}

1.3、 C++的默认命名空间
通过上述代码示例我们有一个疑问? 就是main函数属于哪里?属于哪个namesapce? 那就是默认命名空间,main函数属于默认命名空间,又叫全局命名空间
那么如何调用全局(默认)命名空间呢?如何表示全局(默认)命名空间呢? 下面为你们解惑:

首先要引入一个C++的中符号,就是域作用符号.表现形式是 ::
上述示例中第一种的调用方式:NS1::xxx;NS1是命名空间名称,::是域
作用符,xxx是具体函数/变量/类型。那么到底如何表示全局(默认)
命名空间呢? 
	:: 表示默认(全局)命名空间
	举个例子:
/**
*  调用默认(全局)命名空间的方法
*/
void func2(void); //声明默认(全局)中的函数
// 定义并声明
namespace NS1
{	
	//变量定义
	int a = 11;
	//函数定义
	void func1(void)
	{
		::func2();
	}
	//类型
	enum e1
	{
		e1_mem1,
		e1_mem2,
	};
};

int main(int argc, char **argv)
{	
}
void func2(void)
{
}

1.4、 C++的匿名命名空间

匿名命名空间的定义是没有名字的命名空间,既然没名字那么就不能表示,不能表示,就不能声明,不能声明,就不能外部引用,所以匿名命名空间真正的价值在于此。匿名命名空间中是纯文件内部使用的命名空间不需要在外部引用。类似于static的关键字的作用。

namespace 
{

};

总结:

`
学习新东西,要使用自己已知的知识去类比学习,当自己有一个自己的体系,那么学习新的东西就会很顺了。就比如学习C++,在有C语言基础的情况下,学习C++就会很顺很舒服。知识连成网,就能融汇贯通了。
大家如发现,有不严谨,不对的地方,请多多指教,一定要第一时间告诉啊。后续我会继续做这样的博客。记录学习的点滴。分享是一种美德!感谢每一位分享知识的人,我们都在路上!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值