namespace & using

来源:互联网 发布:淘宝店永久冻结怎么办 编辑:程序博客网 时间:2024/04/29 11:10
命名空间(namespace)是为了避免可能遇到的名字冲突而设计的。一个命名空间是一个作用域,通过命名空间内部定义库中的名字,库的作者(以及用户)可以避免全局名字固有的限制。命名空间的语法形如:
  1. namespace space_name {
  2.    ...  //可以出现在全局作用域的任意声明,包括可以是其他命名空间
  3. }
1.每个命名空间是一个作用域。命名空间内部出现的名字必须唯一,但不同命名空间中可以具有同名成员。命名空间外部的代码必须指出名字定义在哪个命名空间中,或者使用using声明指出。
2.从命名空间外部使用命名空间成员。如下A和B两种方式,其它简化访问的方法稍后讨论。
  1. namespace cpp_primer {
  2.    class Query{
  3.       ...
  4.    };
  5. }

  6. cpp_primer::Query q = cpp_primer::Query("hello");  //A

  7. using cpp_primer::Query;
  8. Query q = Query("hello");  //B
3.命名空间可以是不连续的。意思是说命名空间是累积的,可以出现在很多不同的文件中。即一个namespace定义既可以是定义一个全新的命名空间,也可以是向一个已经存在的命名空间中添加内容。值得注意的是,名字只在声明名字的文件中可见,即在一个文件中声明的名字,对于位于不同文件中的同一个命名空间,也不是立即可见的,在其他文件中仍然需要声明该名字。
4.接口和实现分离。可以使用头文件和实现文件来组织命名空间。
5.定义命名空间成员。在命名空间内部定义和外部定义两种方式形如:
  1. //内部定义方式
  2. namespace cpp_primer {
  3.    class SalesItem {
  4.       // ...
  5.    };
  6.    std::istream&
  7.    operator>>(std::istream& in, SalesItem& s) {
  8.       // ...
  9.    }
  10. }

  11. //外部定义方式
  12. cpp_primer::SalesItem
  13. cpp_primer::operator+(const SalesItem& lhs, const SalesItem& rhs) {
  14.    SalesItem ret(lhs);
  15.    // ...
  16. }
注意到外部定义方式,返回类型和函数名由命名空间名字限定。一旦看到完全限定的函数名,就处于命名空间的作用域中。因此,形参表和函数体中就不需要再使用完全限定的名字来使用某个成员了。
6.不能在不相关的命名空间中定义成员。例如函数cpp_primer::operator+()可以在cpp_primer命名空间中定义,也可以使用限定形式在全局作用域中定义。但是不能定义到另一个无关的命名空间内部。
7.关于全局命名空间。如果没有限定,定义在全局作用域的名字就是定义在全局空间中的。全局命名空间没有名字,所以使用::member_name来引用全局命名空间的成员。
8.嵌套命名空间。是一种层次结构,例如:
  1. namespace A {
  2.    namespace B {
  3.       class Something {
  4.          // ...
  5.       };
  6.    }
  7. }
则完全限定的名字是A::B::Something
9.未命名的命名空间。命名空间可以是未命名的,未命名的命名空间在定义时没有给定名字。
  1. namespace {
  2.    int i;
  3. }
未命名的命名空间的定义局部于特定文件,每个文件有自己的未命名的命名空间。从这点来说,其功能与static(文件静态)的作用一致。但是在C++语境中,建议用未命名的名字空间来取代文件中的静态声明。未命名的名字空间也可以是嵌套的。总体来说,定义于未命名的名字空间内部的成员,使用时相对于有名字的命名空间内的成员要提升一级。
10.命名空间的别名。可以用命名空间别名将较短的同义词与命名空间名字相关联。例如:
  1. namespace an_example_namespace {
  2.    // ...
  3. }
  4.  
  5. namespace aens = an_example_namespace;
11.using指示。using指示不同于using声明。using声明只是将某个特定成员引入到可见状态;而using指示则是将整个命名空间的所有成员引入到当前作用域。
  1. using namespace std;
在实际应用中需要避免使用using指示,因为这种方式可能会重新引入名字冲突的所有问题。

参考:
C++ Primer中文版(第四版)

原创粉丝点击