命名空间的定义、使用和存在的意义 | 您所在的位置:网站首页 › 命名空间名称怎么写好看一点的 › 命名空间的定义、使用和存在的意义 |
命名空间
文章目录
命名空间前言命名空间概念引入1.1 命名空间定义1.1.1 命名空间的一般定义方式1.1.2 命名空间的嵌套定义1.1.3 不连续的命名空间
1.2 命名空间使用1.2.1 第一种:利用命名空间标识符及作用域限定符引入命名空间成员1.2.2 第二种:使用using引入命名空间的成员1.2.3 第三种:使用using namespace 引入命名空间所有成员
1.3 标准命名空间std1.4 扩展阅读1.5 相关问题
总结参考资料
前言
编译工具:visual studio 2019 语言:C++ 命名空间概念引入当C++工程较大时,程序内存在大量的变量、函数和类,如果这些变量、函数和类都存在于同一个作用域中,一不小心就可能会导致命名冲突。为了解决这个问题,C++引入了命名空间(namespace)这个概念,这样在不同的命名空间中允许存在同名的标识符。有了命名空间我们就可以在程序中有效地避免命名冲突,下面举一个利用命名空间解决命名冲突问题的例子。 例程1: #include namespace N1 //定义命名空间N1 { int a = 10; } namespace N2 //定义命名空间N2 { int a = 30; } int main() { int a = 50; printf("N1::a = %d\n", N1::a); //输出命名空间N1中的成员变量a printf("N2::a = %d\n", N2::a); //输出命名空间N2中的成员变量a printf("a = %d\n",a);//输出主函数中的变量a return 0; }输出结果: 例程1中定义了两个命名空间N1和N2,两个命名空间和主函数中都有a变量,但是并没有产生命名冲突,这就是使用namespace的好处。命名空间其实是对标识符的名称进行本地化,以避免命名冲突或名字污染。下面说一下命名空间的定义方式。 1.1 命名空间定义例程1中已经展示使用命名空间的场景,下面我们详细说一下定义命名空间的几种方式。 1.1.1 命名空间的一般定义方式例程2 namespace N3 //定义命名空间N3 { int a; int Add(int x, int y)//成员函数 { return x + y; } }例程2中定义的命名空间N3,称为普通命名空间,C++还有一个自带的标准命名空间std,下文会提到。可以看到,在命名空间中既可以定义变量,也可以定义函数。 1.1.2 命名空间的嵌套定义例程3 namespace N4 { int a; int b; int Add(int x, int y) { return x + y; } namespace N5 { int c; int d; int Sub(int x, int y) { return x - y; } } }例程3中定义的两个命名空间N4和N5,其中N4包含N5,这说明N4的作用域比N5的大。 1.1.3 不连续的命名空间例程4 namespace N6 { int a; int Add(int x, int y) { return x + y; } } namespace N6 { int Mul(int left, int right) { return left * right; } }命名空间可以定义在几个不同的部分中,即命名空间可以由几个单独定义的部分组成1。换句话说,同一个工程中允许存在多个相同名称的命名空间,编译器最后会将同名的命名空间合为一个。例程3中,两个命名空间会被合成一个命名空间N6,N6中包括变量a、函数Add和函数Mul。 以上讲述三种方式命名空间的定义方式,需要注意的一点是:定义一个命名空间就是定义了一个新的作用域,命名空间中的所有内容都局限于该命名空间中,在命名空间之外不能直接调用。 1.2 命名空间使用前面我们学会了如何定义命名空间,那命名空间中成员该如何使用呢?其实命名空间有三种使用方式。 1.2.1 第一种:利用命名空间标识符及作用域限定符引入命名空间成员例程5 #include namespace N { int a = 10; } int main() { int a = 30; printf("命名空间N中的变量a = %d\n", N::a); //打印命名空间N中的变量a printf("main函数中的变量a = %d\n", a); //打印主函数中的变量a return 0; }运行结果: 例程5中,我们想使用变量a,则可以通过命名空间标识符“N”和作用域限定符“::”引入变量a,可以看到命名空间中的成员变量a和主函数中的局部变量a,输出值不同。 1.2.2 第二种:使用using引入命名空间的成员例程6 #include //输入输出流头文件,注意头文件不带后缀.h namespace N { int a = 10; int b = 20; } using N::a;// 引入变量a using N::b;// 引入变量b int main() { int a = 30; printf("命名空间N中的变量b = %d\n", b); //打印命名空间N中的变量b printf("main函数中的变量a = %d\n", a); //打印主函数中的变量a printf("命名空间N中的变量a = %d\n", N::a); //打印命名空间N中的变量a return 0; }运行结果 例程6中,通过using引入b,使用命名空间中成员变量时,不用再添加命名空间标识符“N”和作用域限定符“::”,这样在写程序时会方便不少。另外可以注意到,主函数中的局部变量会屏蔽命名空间中的同名变量(比如a),虽然我们使用using引入a,但如果想使用命名空间中的a,还是需要利用命名空间标识符“N”和作用域限定符“::”。 1.2.3 第三种:使用using namespace 引入命名空间所有成员例程7 #include namespace N { int a = 10; int b = 20; int Add(int left, int right) { return left + right; } } using namespace N;//使用using namespace 引入命名空间成员 int main() { printf("a = %d\n", a); printf("b = %d\n", b); int c = Add(a, b); printf("a+b = %d\n", c); return 0; }运行结果: 可以看到使用using namespace可以把命名空间N中的成员全部引入,这样就能直接使用命名空间中的成员变量了。 1.3 标准命名空间std在1.1节讲到命名空间的定义可以是不连续的,标准命名空间std也不例外,std的定义被分散在多个头文件里2,比如标准输入/输出头文件 中就定义了一个标准命名空间3,里面的函数或类被放在std命名空间中,比如cin和cout这两个函数的名字就放在命名空间std里面,如果我们想使用cout函数,那就必须使用std命名空间引入这个函数。在上文中我们已经知道了命名空间的三种使用方式,下面就利用这三种方式使用标准命名空间std。 第一种:命名空间标识符+作用域限定符 #include int main() { std::cout cout |
今日新闻 |
推荐新闻 |
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 |