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全部显示了出来。

C++中的名字空间和作用域相关推荐

  1. Qt中Ui名字空间以及setupUi函数的原理和实现

    Qt中Ui名字空间以及setupUi函数的原理和实现 分类: Qt GUI 2012-03-08 15:38 10514人阅读 评论(4) 收藏 举报 uiqtsignalclassdelete 用最 ...

  2. C++ 名字空间详解

    代码编译运行环境:VS2017+Win32+Debug 1.名字空间的由来 名字空间(Namespace)是由 C++ 引入的一种新的作用域级别,可以由用户命名,用来处理程序中常见的同名冲突. 原来 ...

  3. C++的名字空间(很重要)

    一.什么是名字空间? C++中对函数.变量.类型进行逻辑上的划分,避免同名的标识符重定义. 当我们在处理非常庞大复杂的项目时,不可避免地需要多人共同合作,可是人一多,取出来的名字难免重复,于是就会发生 ...

  4. C++ 语言学习 day01 (linux ),基本输入输出错误输出函数,名字空间的含义,内联函数,缺省参数,引用 ,、new操作符

    1.介绍c++ C++头文件风格 c++ 老风格:以.h结尾 是c语言风格  stdio.h  (尽量不) c++的转换风格: 去掉.h 在文件名前加c 例如#include <cstdio&g ...

  5. 名字空间:namespace

    在C++中支持三种域:局部域.名字空间域和类域. 名字空间域是随标准C++而引入的.它相当于一个更加灵活的文件域(全局域),可以用花括号把 文件的一部分括起来,并以关键字namespace开头给它起一 ...

  6. python 作用域 前缀_Python 之作用域和名字空间

    作用域与名字空间 Python有一个核心概念是名字空间(namespace),namespace是一个name到object 的映射关系,Python有很多namespace,因此,在代码中如果碰到一 ...

  7. python中嵌套函数的应用实例-实例详解python函数的对象、函数嵌套、名称空间和作用域...

    函数的对象 python中一切皆对象 函数对象的四大功能 引用 def f1(): print("from f1") f1() #调用函数 print(f1) print(&quo ...

  8. python的名字空间(namespace)与作用域(scope)

    名字空间(namespace) 1).名字(name)与对象(object) 对象:对象一块存储区域,用来存储值,同时包含对该值所支持的一系列方法,也包含一系列属性. 名字:每个名字对应一个对象,多个 ...

  9. python 类的执行中保部存值_python函数名称空间与作用域、闭包

    一.命名空间概念 1.命名空间(name space) 名称空间是存放名字的地方. 若变量x=1,1存放在内存中,命名空间是存放名字x.x与1绑定关系的地方. 2.名称空间加载顺序 python te ...

最新文章

  1. IJCAI 2019精选论文一览,从底层到应用都有了
  2. python爬取新闻后提炼_Python爬虫开发的3大难题,别上了贼船才发现,水有多深...
  3. docker清空为none的镜像
  4. 1.3.3 错题整理(组成原理)
  5. eclipse常用以及实用的快捷键
  6. chrome的timeline的问题?
  7. c++ assert() 使用方法
  8. 短短几分钟快速带你掌握C语言指南针!
  9. 如何实现:GridView 控件中显示的文本不自动换行,隐藏超出宽度部分wj-wangjun
  10. vscode终端清屏
  11. null underfined NaN 判断
  12. 启用SATA硬盘的AHCI模式解决X61速度慢的问题
  13. Android ContentProvider初探
  14. git 强行拉取覆盖本地
  15. ubuntu18.04编译U-boot产生的错误
  16. SQLServer--TSQL编程语法
  17. 华为,小米开关控制设置指南总自动弹出
  18. Python爬虫的用途
  19. java jit aot_JIT和AOT编译详解
  20. 著名cad软件cad2022直装版

热门文章

  1. Android Studio连接mysql8.0.25经验贴(三天血与泪的教训)
  2. MVC |分部视图 PartialView()
  3. response对象在servlet中的常用方法讲解
  4. java按钮权限控制_aop (权限控制之功能权限)
  5. x86汇编_高级语言的IF语句_笔记_37
  6. mysql 设置 sql_mode
  7. Cisco模拟器的基本使用
  8. Python开发(基础):列表List
  9. 在excel中,将指定文字(如:设计)批量加粗显示并变成红色字体?
  10. Linear Algebra 线性代数