命名空间(namespace)// 友元函数

17.2、命名空间

命名空间(namespace)为防止名字冲突提供了更加可控的机制。命名空间能够划分全局命名空间,这样使用独立开发的库更加容易了。一个命名空间就是一个作用域,通过在命名空间内部定义库中的名字,库的作者(以及用户)可以避免全局名字固有的限制。

1、命名空间的定义(以关键字namespace开始,后接命名空间的名字)

namespace cplusplus_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 { / * . . * /};
}

这段代码定义了名为cplusplus_primer的命名空间,它有四个成员:两个类,一个重载的+操作符,一个函数。

命名空间可以在全局作用域或者其他作用域内部定义,但不能在函数或者类内部定义。

命名空间内部可以放入:类,变量(以及它们的初始化),函数(以及它们的定义)、模板,以及其他命名空间。

命名空间中定义的名字可以被命名空间中的其他成员直接访问,命名空间外部的代码必须指出名字定义在哪个命名空间中。

从命名空间外部使用命名空间成员时,可以编写using声明:

using cplusplus_primer::Query;

在这个using声明之后,程序可以无需cplusplus_primer限定符而直接使用名字Query。

2、命名空间可以是不连续的,与其他作用域不同,命名空间可以在几个部分中定义。命名空间由它的分离定义部分的总和构成,命名空间是累积的。一个命名空间的分离部分可以分散在多个文件中,在不同文本文件中的命名空间定义也是累积的。

命名空间可以不连续意味着,可以用分离的接口文件和实现文件构成命名空间,因此,可以用与管理自己的类和函数定义相同的方法来组织命名空间:

(1)定义类的命名空间成员,以及作为类接口的一部分的函数声明与对象声明,可以放在头文件中,使用命名空间成员的文件可以包含这些头文件。

(2)命名空间成员的定义可以放在单独的源文件中。

[注]定义多个不相关类型的命名空间应该使用分离的文件,表示该命名空间定义的每个类型。

友元函数

如果在本类以外的其它地方定义了一个函数(这个函数可以是不属于任何类的非成员函数,也可以是其它类的成员函数),在类体中用friend对该函数进行声明,此函数就称为本类的友元函数。一个类的友元函数可以访问这个类中的private成员。
原文地址:https://www.cnblogs.com/rong86/p/3454026.html