命名空间的定义、使用和存在的意义 您所在的位置:网站首页 命名空间名称怎么写好看一点的 命名空间的定义、使用和存在的意义

命名空间的定义、使用和存在的意义

2024-07-17 14:43| 来源: 网络整理| 查看: 265

命名空间

文章目录 命名空间前言命名空间概念引入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 例程1运行结果

  例程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; }

运行结果: 在这里插入图片描述

图2 例程5运行结果

   例程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; }

运行结果 在这里插入图片描述

图3 例程6运行结果

   例程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; }

运行结果: 在这里插入图片描述

图4 例程7运行结果

   可以看到使用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 实验室设备网 版权所有