当前位置 : 主页 > 编程语言 > c语言 >

c++命名空间

来源:互联网 收集:自由互联 发布时间:2023-08-25
随着项目的增大,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能导致名称冲突。例如,两个库可能都定义了名为List、Tree和Node的类,但定义的方式不兼容。用户可能希

随着项目的增大,名称相互冲突的可能性也将增加。使用多个厂商的类库时,可能导致名称冲突。例如,两个库可能都定义了名为List、Tree和Node的类,但定义的方式不兼容。用户可能希望使用一个库的List类,而使用另一个库的Tree类。这种冲突被称为名称空间问题。

1、使用关键字namespace创建命名空间

namespace Jack {
	double pail;
	void fetch();
}  
namespace Jill {
	double fetch;
	int pal;  
}

任何名称空间中的名称都不会与其他名称空间中的名称发生冲突。因此,Jack中的fetch可以与Jill中的fetch共存。

名称空间是开放的(open),即可以把名称加入到已有的名称空间中。

namespace Jill {
	char *goose(const char *);
}

这条语句将名称goose添加到Jill中已有的名称列表中。

2、访问给定名称空间中的名称,使用作用域解析运算符::。

Jack::pail = 1.1;
Jill::pal = 1;

3、我们并不希望每次使用名称时都对它进行限定。

例如std::cin

如果想直接使用cin需要使用using声明

#include <iostream>
using std::cin;

4、using声明使一个名称可用,而using编译指令使所有的名称都可用。using编译指令由名称空间名和它前面的关键字using namespace组成,它使名称空间中的所有名称都可用,而不需要使用作用域解析运算符。

using namespace std;

5、using声明与using编译指令比较

一般说来,使用using声明比使用using编译指令更安全,这是由于它只导入指定的名称。如果该名称与局部名称发生冲突,编译器将发出指示。using编译指令导入所有名称,包括可能并不需要的名称。如果与局部名称发生冲突,则局部名称将覆盖名称空间版本,而编译器并不会发出警告。另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。

6、命名空间可以嵌套

namespace elements {
	namespace fire {
  int flame;
	}
	float water;
}

使用flame格式为
elements::fire::flame = 1。
或者
using namespace elements::fire;
flame = 1;

7、可以对命名空间起别名

namespace my = elements::fire;
my::flame = 10;

8、未命名的命名空间

namespace {
	int flame;
}

由于这种名称空间没有名称,因此不能显式地使用using编译指令或using声明来使它在其他位置都可用。具体地说,不能在未命名名称空间所属文件之外的其他文件中,使用该名称空间中的名称。

9、头文件中不应该含using声明

10、对于using声明,首选将其作用域设置为局部而不是全局

上一篇:模拟实现vector
下一篇:没有了
网友评论