笔者正在学习C++语言,啃书系列将会持续更新,希望可以同大家一起学习,一起进步。如果文章有帮助的话,记得点赞、收藏、关注一条龙哦。
系列文章:
啃书《C++ Primer Plus》之 C++ 函数指针
啃书《C++ Primer Plus》之 C++ 名称空间2
名称空间是C++语言不可或缺的特色,在名称管理上有着举足轻重的作用。这篇文章就来总结一下名称空间这个知识点。
参考资料:《C++ Primer Plus》
本文思维导图如下:
由于内容较多,该节拆分成两部分,本文为上部分,内容到名称空间的冲突。下部分见《名称空间2》
名称空间的作用与使用规则
名称空间解决的问题
在名称空间之前,C和C++语言通过局部、全局、静态等属性限制一个变量或函数的作用域,同时限定其名称作用范围。但是这样的解决方式在面临大项目时还是会出现问题,不同文件可能会定义相同名称的全局变量,这样如果一个文件同时引用了包含同一名称全局变量的两个文件,就会造成名称空间问题。
名称空间的引入,就是为了解决这类问题,为名称提供一个名称空间,不同的名称空间,可以包括相同的名称,彼此互不干涉。
另外,上文提到的全局变量,在引入名称空间的机制后,也有了对应的名称空间——全局名称空间(global namespace)。这个名称空间包含了所有的全局变量。
名称空间特点与成员的声明定义
名称空间特点
名称空间的声明与定义,需要用到关键字: namepace,写法如下:
namespace 名称空间名称{
.
.
.
}
名称空间的作用域是全局。也就是说,对于整个工程,某个文件A引入了包含名称空间S的文件B,那么文件A便可以使用名称空间S。常见的,我们引用 iostream 其中就包含了 std这个名称空间。(这个提点在嵌套时是例外的,在下文会谈到)
名称空间是开放的。 这意味着可以加入一个名称到已有的名称空间中,语法同上。这也就代表着,当编译器检测到上文的语法时,如果已经存在这个名称空间,则会将这个代码块中的内容添加到已有的名称空间中,否则就创建一个新的名称空间。
需要特别注意的是:
名称空间不能位于代码块中!
名称空间不能位于代码块中!
名称空间不能位于代码块中!
名称空间不能位于代码块中!
’写名称空间内容的时候,一定要在代码快之外,不要放在任何的函数等的代码块中。
名称空间内容
在名称空间大括号中可以定义结构,类,变量,函数等,他们都属于这个名称空间。
需要注意的是,结构,类,函数这些内容的声明与定义通常是分开的,而在命名空间中,声明和定义也可以分开写。
我们知道,在c++语言中,声明和定义是两个不同的概念,声明告诉编译器格式,而定义是具体实现。
通常,将成员定义在名称空间中的代码放在 .cpp文件中,而将成员声明在名称空间的代码放在对应的头文件中。
举个栗子:
//test.h
#ifndef TEST_H_INCLUDED
#define TEST_H_INCLUDED
namespace test
{
int k = 10;
int f(int,int);
class A
{
public:
int getA();
void setA(int);
private:
int a;
};
}
#endif // TEST_H_INCLUDED
//test.cpp
#include "test.h"
namespace test
{
int f(int a,int b)
{