命名空间
1.命名空间的定义:
以关键字namespace开始,其后接命名空间的名字:
- namespace cpp_primer {
-
class Sales_item { /*...... */};
-
Sales_item operator+ (const Sales_item&, const Sales_item&);
- class Query{
- public:
- Query (const std::string());
- std::ostream&display(std::ostream&) const;
- }
- class Query_base {/*......*/};
-
}
命名空间的名字在其所在作用域中是唯一的,命名控件可以在全局作用域或者其它作用域内部定义,但是不能在函数或者类的内部定义。
注:命名空间作用域不能以分号结束。
(1)每个命名空间都是一个作用域
命名空间中的每个名字必须引用该命名空间中的唯一实体,命名空间中的实体称为命名空间的成员,不同命名空间的成员可以具有相同的名字。
命名空间内部各成员之间可以直接访问,外部的代码必须指出所引用成员名字定义在哪个命名空间中。
例如:
- cpp_primer::Query q = cpp_primer::Query("Hello");
(2)从命名空间外部使用命名空间成员:
使用限定名namespace_name::member_name
使用这种方法引用成员可能有些麻烦,可以使用using声明
在此声明之后,程序无需使用cpp_primer限定符,可直接使用成员名字Query。
(3)命名空间定义可以是不连续的
与其他作用域不同,命名空间可以在不同的部分定义,命名空间由这些分离的定义部分组成,从这点来看,命名空间的定义是可以累积的。
命名空间可以分散在不同的文件中,在不同的文件中的命名空间定义也是累积的。
由于名字只在声明名字的文件中可见,在这一规定的限制下,如果命名空间的一部分需要定义在另外的文件中,那么被定义部分的名字依然要再次声明。
也就是说,如果该成员之前不存在,那就新增该成员及定义;如果该成员已经在其他文件中声明,那么在此处只是由于要定义所以再次出现了声明。
- namespace namespace_name {
-
-
//declarations
-
-
}
(4) 接口和实现的分离
命名空间可以不连续意味着可以用分离的接口文件和实现文件构成命名空间。因此,可以使用管理类和函数定义相同的方法来组织命名空间。
a.定义类的命名空间成员,以及作为类接口的一部分函数声明、对象声明可以放在头文件中,使用命名空间成员的文件只需要包含这些头文件;
b.对命名空间中成员的定义可以放在单独的源文件中。
注释:根据这个方法,我们也可以通过不同的文件来对同一命名空间中不同类型的成员进行组织,将其放在不同的文件中。
(5) 定义本书的命名空间
以下该书中提供的例子,用来表示命名空间的多文件构成。
- //Sales_item.h
-
namespace cpp_primer{
-
class Sales_item {/*......*/};
-
Sales_item operator+(const Sales_item&, const Sales_item&);
-
//declarations;
-
}
-
-
//Query.h
-
namespace cpp_primer{
-
class Query {
-
public:
-
Query(const std::string&);
-
std::ostream& display(std::ostream&) const;
-
//other declarations
-
}
-
class Query_base{/*......*/};
-
}
-
-
//Sales_item.cpp
-
#include "Sales_item.h"
-
namespace cpp_primer {
-
-
//definations
-
}
-
-
-
//Query.cpp
-
#include "Query.h"
-
namespace cpp_primer {
-
-
//definations
-
-
}
库的开发者可以独立工作于每个类型的实现。
(6) 命名空间成员的定义
可以在命名空间内部直接定义其成员;
也可以在命名空间外部定义命名空间的成员,其方式如下:
- cpp_primer::Sales_item;
-
-
cpp_primer::operator+(const Sales_item& lhs, const Sales_item& rhs){
-
Sales_item ret(lhs);
-
}
(7)不能在不相关的命名空间中定义成员
(8)全局命名空间
定义在全局作用域的名字(在任意类、函数或者命名空间外部声明的名字)是定义在全局命名空间(global namespace)中的。全局命名空间事隐式声明的,存在于每个程序中。
其引用方式如下:
阅读(7324) | 评论(0) | 转发(0) |