精华内容
下载资源
问答
  • namespace名字空间作用域、using namespace名字空间作用域 namespace名字空间作用域用于解决名字相同冲突的问题。 using namespace std;//C++标准std 以下代码就明显的表示了namespace中的变量和全局变量之间的...

    namespace名字空间作用域、using

    namespace名字空间作用域

    namespace名字空间作用域用于解决名字相同冲突的问题。

    using namespace std;//C++标准std

    以下代码就明显的表示了namespace中的变量和全局变量之间的调用区别。

    namespace FYW
    {
    	int a=10;
    	int Sum(int a,int b)
    	{
    		return a+b;
    	}
    }
    
    int a=10;
    
    int main()
    {
    	int b = :: a; //:: 全局作用访问符,访问全局变量a
    	int c = FYW :: a; //加上FYW作用域名称来访问FYW中的a
    }

    如果出现namespace重名情况:

    namespace FYW
    {
    	int a=10;
    	int Sum(int a,int b)
    	{
    		return a+b;
    	}
    }
    
    namespace FYW
    {
    	int a=20;//a重定义
    }

    结论:如果namespace重名,就会合并。

    C语言中有:全局作用域、局部作用域

    C++中有:全局作用域、局部作用域、名字空间作用域、类作用域

     

    namespace加上作用域:

    : : 全局作用域访问符

    名字空间名称: : 名字空间作用域访问符

    类: : 类作用域访问符

     

    using声明

    using namespace //using指示符

    //using声明、using指示符
    int main()
    {
    	using FYW :: a;//using 声明--->只有一个符号暴露
    	using namespace FYW;// using指示符--->所有FYW中的符号暴露
    }

     

    展开全文
  • C++中的名字空间和作用域 C++程序支持四种形式的作用域,分别是: ①:名字空间作用域 ②:局部作用域 ③:类作用域 ④:语句作用域 ...在名字空间作用域内部还可以继续定义其他的名字空间作用域,也就...

    C++中的名字空间和作用域

    C++程序支持四种形式的作用域,分别是:

    ①:名字空间作用域

    ②:局部作用域

    ③:类作用域

    ④:语句作用域

     

    名字空间作用域:就是程序员利用名字空间定义在C++程序中划分出来的一块比较大的程序区段。在该程序区段内部,可以定义类型,函数,模版,变量。名字空间作用域可以跨越多个*.cpp文件而存在。在名字空间作用域内部还可以继续定义其他的名字空间作用域,也就是说,名字空间作用域是可以互相嵌套的。

     

    全局作用域是:C++程序最外层的名字空间作用域,也是最大的名字空间作用域。全局作用域天然存在于C++程序中,它不需要由程序员人为地定义。在全局作用域内部,可以包含其他的,由程序员定义的名字空间作用域,以及没有包含在其他名字空间作用域中的类型,函数,模版,变量。在全局作用域中定义的变量是全局变量,在全局作用域中定义的函数是全局函数。

     

    类作用域:在C++程序中,每定义一个类就会引入一个类域。类体所包含的范围就是类域的范围,在类中定义的所有成员都属于该类域。类域位于名字空间作用域内部,该名字空间作用域可能是全局作用域,也可能是用户定义的名字空间作用域。

     

    语句作用域:每一个函数体内部都是一个局部作用域。该作用域起始于函数体的左花括号“{”,结束于函数体的右花括号“}”。每一个函数都有一个独立的局部作用域。在局部作用域内定义的变量都是局部变量。

    在C++程序中,当要求使用单个语句,但程序逻辑却需要不止一个单个语句的时候,我们可以使用复合语句。复合语句通常被称为块,是用花括号括起来的一些单个语句的集合。在复合语句花括号内部的区段也属于局部作用域。

     

    全局作用域,名字空间作用域,类作用域,局部作用域,语句作用域之间的关系如下图所示:

    从上图可以看出,在全局作用域中,定义了两个名字空间W和S。名字空间W又分别位于两个CPP文件A和B中。由此可见,名字空间作用域是可以跨越CPP文件的。在名字空间S中,除了定义了类型外,又定义了一个名字空间E,所以说,名字空间之间是可以互相嵌套的。另外,在名字空间中可以定义类,函数,变量,模版等。

    在全局作用域中,除了定义的名字空间W和S外,又定义了一个类D,以及全局函数,全局变量和模版。在类D中,定义了一些成员函数,因此引出了局部作用域。在局部作用域中,如果存在控制语句,就会存在语句作用域。

    作用域生命周期在各种作用域中定义的变量或对象,其生命周期从该变量被定义开始,直到该作用域结束。如:在全局作用域中定义的变量,其生命周期是整个程序的生命周期,程序运行结束,该变量被释放;在局部作用域中定义的变量,其生命周期是从定义该变量开始,直到该函数执行完毕。

     

     

    问题:在C++中我们可以通过关键字namespace自定义名字空间,为的就是避免同名变量重定义,比如一个工程中有很多.cpp文件,其中一个.cpp文件让小A完成,另外一个.cpp文件让小B完成。结果这两个人都定义了一个叫tmp的全局变量,这个时候当工程链接的时候就会报错。原因是两个tmp有同样的名字空间,都是位于第4种名字空间中,也有着同样的作用域,都是文件作用域,于是这两个conan就冲突了。

    怎么解决呢?

    答:因为在同一个名字空间中的同一作用域下,相同的名字才会冲突。所以要解决冲突无非就是修改名字空间或者作用域。

    我们一般不会修改变量作用域,所以一般就修改名字空间,这在C语言中是不允许的,因为C语言不可以自定义名字空间,但是在C++中是允许的。

    于是小A将他的int tmp;写成了:

    namespace xiao_A

    {

    int tmp = 10;

    }

    小B将他的int tmp;写成了:

    namespace xiao_B

    {

    int tmp = 20;

    }
    这样小A的tmp就在名字空间xiao_A中了,而小B的tmp就在名字空间xiao_B中了,就不冲突了。

     

     

    我们可以总结出C++中名字空间的作用:

    ①:用来解决名字冲突

    ②:作用域符(::)的使用

    1. global scope(全局作用域符),用法(::name)
    2. class scope(类作用域符),用法(class::name)
    3. namespace scope(命名空间作用域符),用法(namespace::name)

    ③:using 声明

           using namespace 指示符

    ④:名字空间重名 =》合并

     

    接下来我们可以验证一下以上的结论:

    而我们要调用名字空间为CY1202中的sum函数,有以下几种方法:

    ①:使用using声明

    ②:使用using namespace指示符

    ③:使用命名空间作用域符,用法(namespace::name)

    ④:同名空间作用域 会进行合并

    可以看到,两个CY1202名字空间进行了合并,在main函数中调用时,将a,c,sum全部显示了出来。

     

     

    展开全文
  • 名称空间作用

    2020-10-30 11:19:15
    名称空间作用域一、名称空间1.1 内置名称空间1.2 全局名称空间1.3 局部名称空间二、作用域2.1 全局作用域与局部作用域2.2 作用域与名字查找的优先级 一、名称空间 什么是名称空间?即用来存放名字与对象映射/绑定...

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    一、名称空间

    什么是名称空间?即用来存放名字与对象映射/绑定关系的地方。对于x = 3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,delx表示清除该绑定关系。
    在程序执行过程中,会存在三种名称空间

    1.1 内置名称空间

    伴随python解释器的启动/关闭而产生/回收,因而是第一个被加载的名称空间,用来存放一些内置的名字,比如内置函数

    >>> max
    <built-in function max>
    

    1.2 全局名称空间

    伴随python文件的开始执行/执行完毕而产生/回收,是第二个被加载的名称空间,文件执行过程中产生的名字都会存放于该名称空间

    1.3 局部名称空间

    伴随函数的调用/结束而临时产生/回收,函数的形参、函数内定义的名字都会被存放于该名称空间

    name = "小猿圈"  # 全局变量
    
    def outter():
        name = "小猿圈,自学编程"  # 局部变量
        print("局部变量函数调用:",name)
    
    outter()
    print("全局变量文件调用:",name)
    
    #局部变量函数调用: 小猿圈,自学编程
    #全局变量文件调用: 小猿圈
    

    小结:
    名称空间的加载顺序:内置名称空间>>全局名称空间>>局部名臣空间
    名称空间的查找顺序:局部名称空间>>全局名称空间>>内置名称空间
    数据逐级向外查找

    二、作用域

    2.1 全局作用域与局部作用域

    按照名字作用范围的不同可以将三个名称空间划分为两个区域:
    1、全局作用域:内置名称空间、全局名臣空间属于全局作用范围,该范围内的名字全局存活,全局有效;
    2、局部作用域:局部名称空间属于局部范围,该范围的名字临时存活,局部有效。

    2.2 作用域与名字查找的优先级

    在局部作用域查找名字时,起始位置是局部作用域,所以先查找局部名称空间,如果没有找到,再去全局作用域查找,还没有找到就在内置名称空间中查找,都没有找到就会抛出异常。查找顺序:局部名称空间>>全局名称空间>>内置名称空间

    x = 100  # 全局变量
    def foo():
        x = 300  # 局部变量
        print(x)
    foo()  # 调用局部变量
    print(x)  # 调用全局变量
    
    #300
    #100
    
    x = 100  # 全局变量
    def foo():
        print(x)
    foo()  # 无局部变量,调用全局变量
    #100
    

    可以调用内建函数locasl()和globals()来分别查看局部作用域和全局作用域的名字,查看的结果都是字典格式。在全局作用域查看到的locals()的结果等于globals()

    def foo():
        name = "rose"
        gender = "female"
        print(locals())   #  {'name': 'rose', 'gender': 'female'}
        print(globals())  # pass
    foo()
    

    同时,可以利用global在局部名称中声明全局变量(了解,不推荐使用)

    def foo():
        global name  # 在函数内部声明(创建)一个全局变量
        name = "hahaha"
        age = 23
        print(name)
    
    foo()
    print(name)
    
    #hahaha
    #hahaha
    
    展开全文
  • 名称空间作用

    千次阅读 2020-03-22 16:32:41
    文章目录名称空间作用域一、名称空间1.1 内置名称空间1.2 全局名称空间1.3 局部名称空间1.4 加载顺序1.5 查找顺序二、作用域2.1 全局作用域2.2 局部作用域2.3 注意点2.4 函数对象+作用域应用三、补充知识点3.1 ...

    名称空间和作用域

    函数内部的函数只能在函数内部调用,不能在函数外部调用,通过接下来的学习你将会知道为什么会出现这种情况。

    def f1():
        def f2():
            print('from f2')
        f2()
    
    f2()  # NameError: name 'f2' is not defined
    

    一、名称空间

    名称空间(name spaces):在内存管理那一章节时,我们曾说到变量的创建其实就是在内存中开辟了一个新的空间。但是我们一直在回避变量名的存储,其实在内存中有一块内存存储变量名与变量间的绑定关系的空间,而这个空间称为名称空间。

    1.1 内置名称空间

    内置名称空间:存放Pyhton解释器自带的名字,如int、float、len

    生命周期:在解释器启动时生效,在解释器关闭时失效

    1.2 全局名称空间

    全局名称空间:除了内置和局部的名字之外,其余都存放在全局名称空间,如下面代码中的x、func、l、z

    生命周期:在文件执行时生效,在文件执行结束后失效

    x = 1
    
    
    def func():
        pass
    
    
    l = [1, 2]
    
    if 3 > 2:
        if 4 > 3:
            z = 3
    

    1.3 局部名称空间

    局部名称空间:用于存放函数调用期间函数体产生的名字,如下面代码的f2

    生命周期:在文件执行时函数调用期间时生效,在函数执行结束后失效

    def f1():
        def f2():
            print('from f2')
        f2()
    
    f1() 
    

    46名称空间与作用域-简单.png?x-oss-process=style/watermark

    1.4 加载顺序

    由于.py文件是由Python解释器打开的,因此一定是在Python解释器中的内置名称空间加载结束后,文件才开始打开,这个时候才会产生全局名称空间,但文件内有某一个函数被调用的时候,才会开始产生局部名称空间,因此名称空间的加载顺序为:内置–》全局–》局部。

    1.5 查找顺序

    由于名称空间是用来存放变量名与值之间的绑定关系的,所以但凡要查找名字,一定是从三者之一找到,查找顺序为:
    从当前的所在位置开始查找,如果当前所在的位置为局部名称空间,则查找顺序为:局部–》全局–》内置。

    x = 1
    y = 2
    len = 100
    
    
    def func():
        y = 3
        len = 1000
        print(f"y: {y}")
        print(f"len: {len}")
        # print(a)  # NameError: name 'a' is not defined
    
    
    func()
    y: 3
    len: 1000
    x = 1
    
    
    def func():
        print(x)
    
    
    x = 10
    func()
    10
    

    二、作用域

    域指的是区域,作用域即作用的区域。

    46名称空间和作用域-地图.jpg?x-oss-process=style/watermark

    2.1 全局作用域

    全局作用域:全局有效,全局存活,包含内置名称空间和全局名称空间。

    # 全局作用域
    x = 1
    
    
    def bar():
        print(x)
    
    
    bar()
    1
    

    2.2 局部作用域

    局部作用域:局部有小,临时存储,只包含局部名称空间。

    # 局部作用域
    def f1():
        def f2():
            def f3():
                print(x)
            x = 2
            f3()
        f2()
    
    
    f1()
    2
    

    2.3 注意点

    需要注意的是:作用域关系在函数定义阶段就固定死了,与函数的调用无关。

    # 作用域注意点
    x = 1
    
    
    def f1():  # 定义阶段x=1
        print(x)
    
    
    def f2():
        x = 2
        f1()
    
    
    f2()
    1
    

    2.4 函数对象+作用域应用

    # 作用域应用
    def f1():
        def inner():
            print('from inner')
        return inner
    
    
    f = f1()  # 把局部定义的函数放在全局之中
    
    
    def bar():
        f()
    
    
    bar()
    from inner
    

    三、补充知识点

    3.1 global关键字

    修改全局作用域中的变量。

    x = 1
    
    
    def f1():
        x = 2
    
        def f2():
            #         global x  # 修改全局
            x = 3
        f2()
    
    
    f1()
    print(x)
    1
    x = 1
    
    
    def f1():
        x = 2
    
        def f2():
            global x  # 修改全局
            x = 3
        f2()
    
    
    f1()
    print(x)
    3
    

    3.2 nonlocal关键字

    修改局部作用域中的变量。

    x = 1
    
    
    def f1():
        x = 2
    
        def f2():
            #         nonlocal x
            x = 3
    
        f2()
        print(x)
    
    
    f1()
    2
    x = 1
    
    
    def f1():
        x = 2
    
        def f2():
            nonlocal x
            x = 3
    
        f2()
        print(x)
    
    
    f1()
    3
    

    3.3 注意点

    1. 在局部想要修改全局的可变类型,不需要任何声明,可以直接修改。
    2. 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量,即可直接修改。
    lis = []
    
    
    def f1():
        lis.append(1)
    
    
    print(f"调用函数前: {lis}")
    f1()
    print(f"调用函数后: {lis}")
    调用函数前: []
    调用函数后: [1]
    
    展开全文
  • 主要介绍了python作用域与名字空间原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Python 名称空间作用

    千次阅读 2018-01-20 08:51:46
    这篇文章介绍 Python 的名称空间以及变量的作用域。 Python 的名称 Python 的名称(Name)是对象的一个标识(Identifier)。我们知道,在 Python 里面一切皆对象,名称就是用来引用对象的。说得有点玄乎,我们以...
  • 主要给大家介绍了关于C/C++中名字空间作用域的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用c/c++具有一定的参考学习价值,需要的朋友们下面随着小编来一起看看吧。
  • 文章目录一、名称空间1、内置名称空间2、全局名称空间3、局部名称空间二、作用域1、作用域与名字查找的优先级2、LEGB(四种名称空间)3、global关键字4、nonlocal关键字 一、名称空间 首先我们应该知道,栈一般存...
  • 帅兰一、名称空间1、内置名称空间2、全局名称空间3、局部名称空间4、加载与查找顺序二、作用域1、两种作用域2、作用域与名字查找的优先级3、globals()与nonlocal()的使用 一、名称空间 名称空间即存放名字与对象映射...
  • 文章目录一、名称空间1.1 内建名称空间1.2 全局名称空间1.3 局部名称空间二、作用域2.1 全局作用域与局部作用域2.2 作用域与名字查找的优先级 一、名称空间 名称空间即存放名字与对象映射/绑定关系的地方。对于x=3,...
  • 文章目录一、名称空间1、内置名称空间2、全局名称空间3、局部名称空间二、作用域1、作用域与名字查找的优先级2、LEGB(四种名称空间)3、global关键字4、nonlocal关键字 一、名称空间 首先我们应该知道,栈一般存...
  • 文章目录一 名称空间1.1 内建名称空间1.2 全局名称空间1.3 局部名称空间作用域 一 名称空间 名称空间即存放名字与对象映射/绑定关系的地方。对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系...
  • ppt的内容大家可以看http://wenku.baidu.com/view/744de524ccbff121dd3683ee.html
  • C++名称空间作用

    2010-04-15 22:49:51
    很好的一本C++较少名称空间作用域的书籍,让你更加了解名称空间的机制。。。。
  • 要想访问一个变量的值,必须先去名称空间中拿到对应的名字才能够访问变量的值,对于x=3,Python会申请内存空间存放对象3,然后将名字x与3的绑定关系存放于名称空间中,del x表示清除该绑定关系。 在程序执行期间最多会...
  • 主要介绍了python函数的对象、函数嵌套、名称空间作用域 ,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下
  •  名称空间是存放名字的地方。  若变量x=1,1存放在内存中,命名空间是存放名字x、x与1绑定关系的地方。 2、名称空间加载顺序 3、名字的查找顺序  局部名称空间——》全局名称空间——》内置名称空间  ...
  • C和C++中的名字空间作用域 C语言中有名字空间这个概念吗? 提到名字空间(或者可能更普遍的叫法,命名空间),很可能先想到的是C++,甚至是C#。C中没有名字空间吧?一开始我也是这样认为的,直到我看了C primer ...
  • 作用名称空间可以使栈区中存放相同的名字,从而解决命名冲突 名称空间分为三种: 内置名称空间 全局名称空间 局部名称空间 内置名称空间 内置名称空间:用于存放Python解释器中内置的名字 生命周期:Python...
  • Python名称空间的概念 and 作用域应用

    千次阅读 2020-11-29 19:45:55
    前言: 在内存中开辟的一块空间用于存放...存放内置的名字,该名称空间伴随着解释器启动就产生了,内置空间存放了如:print、len、input等内置方法 生命周期:当解释器关闭时则销毁 print('123') len('123') input('1
  • 名称空间,存放名字的地方,准确的说名称空间是存放名字与变量值绑定关系的地方 内置名称空间:python自带的名字,在python解释器启动时产生,存放一些python内置的名字 全局名称空间:在执行文件时,存放文件级别...
  • c语言标识符的名字空间作用

    千次阅读 2013-01-30 21:34:28
    c语言的标识符有4种名字空间: 1. 标号名(label)。 2. 结构,联合和枚举的标记(tag)。...有一个通用的规则,在同一作用域同一名字空间中,标识符不同名即可。 说明如下: 1. 标号名只限定在函数作用

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 549,982
精华内容 219,992
关键字:

名字空间的作用