C++的名称空间

一、名称空间

C++中,名称可以是变量、函数、结构、枚举、类以及类和结构的成员。当出现相同名称但是有不同的含义时会发生冲突,尤其是不同的类库中存在相同的名称时,C++标准提供了名称空间工具,可以更好的控制名称的作用域。

1.1、传统的C++名称空间

声明区域:可以在其中进行声明的区域。比如全局变量的声明区域为整个文件,局部变量的声明区域就是所在的代码块。
潜在作用域:从声明点开始,到其声明区域的结尾。(潜在作用域比声明区域小,因为变量必须定义后才能使用)。
作用域:变量对程序而言可见的范围。(作用域可能比潜在作用域小,比如全局变量可能会被函数内同名局部变量隐藏导致不可见)

1.2、新的C++名称空间

a、通过定义一种新的声明区域来创建命名的名称空间,这样可以提供一个声明名称的区域,这样一个名称空间的名称不会与另一个名称空间内的相同名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。

namespace Jill
{
	double bucket(double n);		       		   //函数声明
	double fetch;								   //变量声明
	int pal;									   //变量声明
	struct Hill{};								   //结构体声明
}

b、名称空间可以是全局的也可以存在于其他的名称空间内,但是不能位于代码块中,默认名称空间内声明的名称的链接性是外部的。
c、除了用户定义的名称空间外,还存在一个定义好的名称空间-全局名称空间。对应了文件级声明区域。
d、名称空间是开放的,可以把名称或函数声明加入已有的名称空间中,也可以在文件的其他地方或另一个文件中再次使用该名称空间添加函数原型;

namespace Jill
{
	char t;
	char * goose(const char *);
	double bucke(double n) {....}
}

e、访问给定名称空间内的名称。通过作用域解析运算符::,使用名称空间来限定该名称。

Jill::fetch = 3.3;    //给变量赋值
Jill::bucket(4.4);	  //调用名称空间内的函数
Jill::Hill mole;	  //创建一个名称空间内的结构体类型变量

1.3、using声明和using编译

C++提供了两种机制来简化对名称空间中名称的使用,using声明可使特定的标识符可用,using编译指令可以使整个名称空间可用。
需要注意,using声明和using编译增加了名称冲突的可能性。且using声明比using编译更安全,因为using声明只导入特定的名称,一旦于局部变量发生冲突,编译器将给出提示。而using编译导入所有的名称,一旦与局部名称冲突,编译器会使用局部名称将名称空间版本名称,不会给出警告提示。

1.3.1、using声明

using声明由关键字using和被限定的名称组成。

using Jill::fetch;

using声明将特定的名称添加到它所属的声明区域中,完成该声明后,便可以使用名称fetch代替Jill::fetch。

double fetch;
int main ()
{
	using Jill::fetch;
	double fetch;       // 这是错误的!,已经有一个局部变量fetch了。
	cin >> fetch;       //读取一个输入值到Jill::fetch中
	cin>>::fetch;	  //读取一个输入值到全局变量fetch中
}

using声明将名称添加到局部声明区域中,所以无法将另一个局部变量也声明为fetch了,同时Jill::fetch将同名的全局变量隐藏。

1.3.2、using编译指令

using声明由关键字using namespace 和被限定的名称空间组成。这将会使名称空间内的所有的名称都可用,而不需要使用作用域解析运算符::。
using namespace Jill;
using namespace std;

1.4、名称空间极其前途

a、使用在已命名的名称空间中声明的变量,而不是使用外部全局变量。
b、使用在已命名的名称空间中声明的变量,而不是静态全局变量。
c、如果开发了一个函数库或类库,应该将其放在一个名称空间内,比如C++提倡将标准函数库放在名称空间std内,
d、仅将using编译指令作为一种将旧代码转换为使用名称空间的权宜之计。
e、不要在头文件中使用using编译指令,这样会隐藏要让哪些名称可用。
f、导入名称时,首选作用域解析运算符或using声明的方法。
g、对于using声明,应该首选将作用域设置为局部而不是全局。

二、多文件组织策略

C++鼓励程序员在开发程序时使用多个文件,一种有效的组织策略是:
1、使用头文件来定义用户类型,为操纵用户类型的函数提供函数原型。
2、并将函数的定义放在一个独立的源代码文件里,头文件和源文件一起定义和实现了用户定义的类型及其使用方式。
3、将负责调度的主函数和其他使用这些函数的函数放在第三个文件里。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值