C++命名空间
- 命名空间
- A.What(什么是命名空间)
- B.Why(为什么要使用命名空间)
- C.Which(命名空间有哪些类型)
- 全局命名空间
- 嵌套命名空间
- 内联命名空间
- 匿名命名空间
- D.内联命名空间
- What
- Why(内联命名空间的作用)
- E.匿名命名空间(未命名的命名空间)
- What
- Why(匿名命名空间的作用)
- F.命名空间的别名
- G.using namespace std声明
命名空间
A.What(什么是命名空间)
用来避免命名冲突和组织代码的一种机制。它可以将全局作用域划分为不同的区域, 每个区域中可以定义相同名称的变量、函数、类等,而它们之间不会发生命名冲突
B.Why(为什么要使用命名空间)
避免冲突和组织代码
C.Which(命名空间有哪些类型)
全局命名空间
全局作用域:
所有类、函数及命名空间的作用域被称为全局作用域
全局命名空间:
全局作用域范围的空间,全局作用域中定义的成员名字被隐式地添
加到全局命名空间,访问全局命名空间的成员(::member_name)
嵌套命名空间
命名空间A中嵌套了命名空间B
namespace A
{
namespace B
{
class Student{...}
}
}
访问方式:
A::B::Student stuObj;
内联命名空间
被关键字inline修饰的命名空间,内联命名空间的成员可以直接被外层命名空间访问
namespace A
{
inline namespace Animal_Namespace
{
string strPandas = "Pandas";
string strDog = "Dog";
}
void display()
{
std::cout<<strPandas<<std::endl; //可以直接访问
}
}
匿名命名空间
没有名字的命名空间
namespace
{
double dHumanAveAge = 78.2;
}
D.内联命名空间
What
被关键字inline修饰的命名空间,内联命名空间的成员可以直接被外层命名空间访问
namespace A
{
inline namespace Animal_Namespace
{
string strPandas = "Pandas";
string strDog = "Dog";
}
void display()
{
std::cout<<strPandas<<std::endl; //可以直接访问
}
}
Why(内联命名空间的作用)
-
向后兼容:
使用内联命名空间,可以在现有的命名空间中添加新的函数、类或变 量而无需修改原始代码。这样,在库的更新版本中,用户可以继续使用原始命名空 间,并享受到新功能的好处,而无需修改其它代码
-
细粒度命名空间控制:
内联命名空间允许将部分代码放入特定的命名空间中,从而实现更细粒度的命名空间控制,如下例子所示:
namespace A { inline namespace Spring { string strWhere = "Shengzhen"; long lYear = 1980; } inline namespace Winter { string strWhere = "Dongbei"; long lYear = 1998; } void display() { std::cout<<Spring::strWhere<<"..."<<Spring::lYear<<std::endl; std::cout<<Winter::strWhere<<"..."<<Winter::lYear<<std::endl; } }
-
代码组织化和模块化:
使用内联命名空间可以将相关的功能组织在一起,形成模块化的代码结构
-
名称隐藏:
内联命名空间中的标识符不会污染外部命名空间,这意味着可以在内联命名空间中定义与外部命名空间中相同名称的标识符,而不会导致冲突
E.匿名命名空间(未命名的命名空间)
What
没有名字的命名空间被称为匿名命名空间
namespace
{
double dHumanAveAge = 78.0;
}
注意:未命名的命名空间中的成员具有静态声明的周期,但它仅在本文件中有效,作用域不会跨文件存在
Why(匿名命名空间的作用)
- 取代静态声明:未命名的命名空间中声明变量取代文件中的静态声明
- 隐藏细节:匿名命名空间中的成员仅在本文件中可见,这样可以隐藏一些实现细节,防止其它文件直接访问和修改
- 提供内部实现:匿名命名空间可以用来定义一些只在当前文件夹中使用的辅助函数、变量或类,可以将这些实体与其它文件的接口分离,提高代码的可维护性
F.命名空间的别名
namespace AnimalNamespace {...}
namespace AniSpace = AnimalNamespace; //接下来的程序就可以使用AniSpace替代AnimalNamespace
G.using namespace std声明
using std::cout;
cout<<"Hello world"<<std::endl;
using std::endl;
cout<<"Oh, My gold!"<<endl; //上述using代码将cout和endl注入到了当前作用域中