C++基础篇--作用域和自定义命名空间

本文介绍了C++中的作用域和命名空间概念,通过类比解释了如何解决重名问题。作用域决定了变量、函数等元素的可见范围,而命名空间用于避免全局命名冲突。C++提供了用户自定义命名空间(UDNS)来组织代码,通过`using`关键字可以方便地引用命名空间中的成员。此外,还讨论了无名命名空间和标准命名空间`std`的使用。
摘要由CSDN通过智能技术生成

引子

   为引出本文主题,先举个例子,以便后文对照理解:某学校一年招了3个叫李明的学生,为便于区分:1)按年龄排序分别称大、中、小李明;2)把他们分到不同班,这样各班内部就没有同名的李明,而学校范围内可用1/2班李明区分;3)大李明加入绘画协会,中李明加入书法协会,小李明加入绘画和外语协会,于是绘画协会里还要用大小或班级区分两个李明。

基本几点:

1.谈到重名,需要指定具体集合范围。全校集里3个李明,各班内部无重名,绘画协会里2个李明。学术化表述就是(校/协会)域内存在命名冲突。

2.方法一:把存在重名元素的集合分成若干子集,同名元素分到不同子集,用子集名+元素名方式区分(123班李明)。

3.方法二:利用重名元素其他固有属性,即名字+属性进行区分(大中小李明)。两种方法可同时使用。

作用域及域内/域间重名

    C/C++中变量、函数及类等元素起作用的范围,称为作用域。在某作用域内为元素命名时,可选择的命名范围称为命名空间(C++新增的一个feature:用户自定义命名空间,也常被简称为命名空间namespace,为区别下文称前者为generalized namespace(GNS).后者user defined namespace(UDNS)。举例:

    int c;         //

    fun1()

    {

       int a,b ;

       int c;       //

       c=a+b;     //

    }

    fun2()

    {

       int a, b;

       c=a+b;     //

    }

    int a,b;定义于两个函数内局部作用域,这两个局部作用域的GNS相互独立不干扰,即同层次不同作用域间GNS无重叠,因此两套a,b不冲突,这很好理解。

    ①处的c作用于全局域,和②处fun1内的c属于不同层的域间同名,这种情况的选择原则是向上就近优先,即:fun1域内③处引用的c就近选择同一域内②定义的局部变量c而不是全局域①的全局变量c;而fun2内没有定义c,④处才向上选择全局域①。

    C语言大致分3层作用域:全局、单个文件及局部(函数及更小的{}功能模块内,如for{}, while{}或独立{}),C++开始引入类作用域,后来又加入用户自定义的命名空间作用域(后半部分讲解)。处于不同层次作用域内部和域间的元素,命名冲突及覆盖关系如下:

    1)函数或{}模块内的变量(即局部变量)数量有限,命名选择充裕(除非某些懒人总用单个字母a,b,c,d命名变量:))。而不同函数或模块间的命名又互不干扰,因此局部域没有命名冲突问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值