C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性

Posted thefist11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性相关的知识,希望对你有一定的参考价值。

1. 命名空间成员

定义在命名空间中的实体称为命名空间成员。

在命名空间中定义的名字能够被命名空间中的其它成员直接訪问,命名空间外部的代码必须指出名字定义在哪个命名空间中

  • 命名空间中定义的成员可以直接使用名字, 此时无须前缀
  • 在命名空间定义的外部定义该命名空间的成员
  • 命名空间之外定义的成员必须使用含有前缀的名字

eg. 可以在 cplusplusprimer 或全局作用域中定义 Sales_data operator+, 但是不能在一个不相关的作用域中定义这个运算符。

#include "Sales_data •h"
namespace cplusplus_primer {  //重新打开命名空间 cplusplus_primer
	//命名空间中定义的成员可以直接使用名字, 此时无须前缀
	std::istream& operator()(std::istream& in, Sales_data & s ) { /* ... */ }
}
cplusplus_primer::Sales_data cplusplus_primer::operator+ (const Sales_data& lhs, const Sales_data& rhs)
{ 
	Sales_data ret (lhs);
	//..
}

2. 模板特例化

// 我们必须将模板特例化声明成std的成员
namespace std {
    template <> struct hash<Sales_data>;
}

// 在std中添加了模板特例化的声明后,我们就可以在命名空间std的外部定义它了
template<> struct std::hash<Sales_data>
{
    size_t operator()(const Sales_data& s) const
    {
        return hash<string>()(s.bookNo) ^
            hash<unsigned>()(s.units_sold) ^
            hash<double>()(s.revenue);
    }
};

3. 全局命名空间global namespace

::member name 表示全局命名空间中的一个成员

4. 嵌套的命名空间

namespace cplusplus_primer {
    //第一个嵌套的命i空间:定义了库的 Query 部分
    namespace QueryLib {
        class Query { /*...*/ };
        // ...
    }

    //第二个嵌套的命名空间:定义了库的 Sales_data 部分
   namespace Bookstore {
        class Quote { / * ... */ };
        class Disc_quote public Quote { /* ... */ };
        //...
}

//调用方式
cplusplus_primer::QueryLib::Query

4.1 作用域

嵌套的命名空间中的名字遵循的规则与往常类似: 内层命名空间声明的名字将隐藏外层命名空
间声明的同名成员。

以上是关于C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性的主要内容,如果未能解决你的问题,请参考以下文章

C++ Primer 5th笔记(chap 18 大型程序工具)noexcept

C++ Primer 5th笔记(chap 18 大型程序工具)异常处理

C++ Primer 5th笔记(chap 18 大型程序工具)捕获异常

C++ Primer 5th笔记(chap 18 大型程序工具)命名空间特性

C++ Primer 5th笔记(chap 18 大型程序工具) 重载与命名空间

C++ Primer 5th笔记(chap 18 大型程序工具)构造函数与虚继承