• C++命名空间详解



    在C语言中,当我们在创建变量的时候,总会想一下这个变量名会不会和已有的标识符起冲突,而在C++中,随着库的内容越来越丰富,就会有很多的变量、函数名字相同,而为了解决命名冲突的问题,C++就诞生了 命名空间

    预作用分解符::

    看下面例子

    image-20220919121220675

    在C语言中我们学过局部优先原理,所以上述代码输出了20,那么我们就是想输出10,那么该怎么输出呢?这时就需要用到预作用分解符了

    image-20220919121658630

    在输出rand时,在前面加上::就能够输出10了。

    ::的作用可以理解为改变查找规则,在C语言中默认的查找规则就是先局部,后全局。而如果有了::就可以实现直接去全局找而不去局部,::还可以指定直接去特定的中查找。

    ::的前面如果什么都不加,就代表直接去全局中找,而如果::的前面加了域名,就会直接去该域中查找。

    命名空间

    看下面代码

    image-20220919122710977

    image-20220919123312905

    image-20220919123443319

    我们都知道在头文件stdlib.h中有个函数叫rand,而在引用了该文件的同时在全局定义变量rand时就会出现命名冲突,而在局部定义变量rand时,就不会出现命名冲突。这个也很正常,因为局部和全局是两个不同的域,并且在局部定义的也输出了10,在全局的rand也输出了该函数的地址。

    那么这时就有一个问题,我们怎么样才能够在全局再定义一个rand呢?这时就需要命名空间了。

    image-20220919124021150

    这里用到了关键字namespace,后面跟上我们自定义的名字haha和大括号,这时名为haha的域就建立好了,我们在里面创建变量就不会和域外面的起冲突了,当然了在同一块域中也是会存在命名冲突的问题的。

    需要注意的是,在haha中的变量rand和在全局中的变量性质是一样的,都是存放在静态区的,只是给rand建了一座围墙haha,我们首先遵循的规则是先局部、后全局,在main函数中并没有定义rand,所以去全局找,注意此时haha中的rand也是在全局的,但是这里并没有输出10,而是输出了stdlib.h中的rand函数的地址,那是因为我们去全局找的时候找不到haha中的rand,因为有haha这座围墙着,所以我们如果想输出10,就得用到::

    image-20220919125333140

    上面说到::是改变查找规则的,我们在::前面写上我们指定的域haha,这时就会直接去haha中查找rand。

    如何简单理解::和命名空间呢?

    我们可以把命名空间想象成一座围墙,在命名空间里的变量和其它的任何变量并无区别,只是加上了一座围墙,使得编译器去寻找的时候找不到命名空间里的变量。而::就可以理解为一把钥匙,::可以进入指定的围墙里面,使得编译器去寻找的时候就能够找到命名空间里的变量。

  • 相关阅读:
    线性代数学习笔记3-4:描述线性变换的空间压缩情况(列空间、秩)
    软考-高项-论文-信息系统项目的风险管理
    Vue笔记_03组件_mavonEditor组件(基于vue)
    MCAL实战三(S32K324-NXP EB tresos Port驱动配置详解)
    Linux——线程详解(一)
    Nginx proxy_pass 详解
    VM虚拟机克隆
    Java工厂模式
    【Netty 源码分析】
    【云栖2023】张治国:MaxCompute架构升级及开放性解读
  • 原文地址:https://blog.csdn.net/qq_67569905/article/details/126931636