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 大型程序工具)命名空间特性