C++随记(九)---名称空间

C++随记(九)---名称空间

C++中,名称可以是变量、函数、结构、类等等,项目增大会使得名称冲突的可能性增大,人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了,可能会导致名称冲突。C++标准提供了名称空间工具,以便更好的控制名称的作用域。

首先介绍一些相关概念。

①声明区域:指可以在其中声明的区域。

②潜在作用域:变量的潜在作用域从声明点开始,到其声明区域的结尾。因此潜在作用域比声明区域小(变量必须先定义后使用)。

C++关于全局变量和局部变量的规则定义了一种名称空间层次。每个声明区域都可以声明名称,这些名称独立于其他声明区域中的名称。

C++新增了这样一种功能,即通过 定义一种新的声明区域来创建命名的名称空间,这样做的目的之一是提供一个声明名称的区域。一个名称空间中的名称不会和另一个名称空间中的名称发生冲突,同时允许程序的其他部分使用该名称空间中声明的东西。

名称空间可以是全局的,也可以位于另一个名称空间中,但是不能位于代码块中。

1、using 声明和using编译指令

  using声明使特定的标识符可用:

  using std::cout;//将cout添加到它所属的声明区域中,即使得cout能够在main函数中直接使用

using编译指令使整个名称空间可用:

  using namespace std;//使得std空间中所有的名称都可以直接使用

2、using编译指令和using声明之比较

使用using声明时,就好像声明了相应的名称一样,如果某个名称已经在函数中声明了,则不能用using声明导入相同的名称。

然而,使用using编译指令时,将进行名称解析,就像在包含using声明和名称空间本身的最小声明区域中声明了名称一样。如果使用using编译指令倒入一个已经在函数中声明的名称,则局部名称将隐藏名称空间名,就像隐藏同名的全局变量一样。

●一般来说,使用using声明要比使用using编译指令更加安全,这是由于它只能导入指定的名称,如果该名称与局部名称发生冲突,编译器将发出指示。

○using编译指令导入所有的名称,包括可能并不需要的名称,如果与局部名称发生冲突,则局部名称将覆盖名称空间版本而编译器不发出警告!  另外,名称空间的开放性意味着名称空间的名称可能分散在多个地方,这使得难以准确知道添加了哪些名称。所以我们平时自己写程序时先怼一个using namespace std;上去可能并不是一个很好的决定。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

Promise接口实现之jQuery 的deferred对象

本文作者:IMWeb json 原文出处:IMWeb社区 未经同意,禁止转载 Promise是什么? 我们知道JavaScript是单线程,如果遇到某...

17410
来自专栏GreenLeaves

C# checked和unchecked运算符

1、作用 checked和unchecked运算符用于CLR(公共语言运行时)强制对它们所作用的代码块,进行(不进行)代码溢出检测 2、示例说明 有代码如下: ...

1868
来自专栏Brian

C语言心得一

C语言学习 ---- C语言是一个非常灵活且高效的语言,在学习的过程中总会有很多坑。最近有一个项目是混合编程,高性能部分采用C/C++来完成,数据处理和分析采用...

2496
来自专栏个人随笔

JavaScript 网页脚本语言 由浅入深

1)基础 学习目的: 1. 客户端表单验证 2. 页面动态效果 3. jQuery的基础 什么是JavaScript? 一种描述性语言,也是一种基于对象和事件驱...

33610
来自专栏Python小屋

Python中的枚举类型及其用法

>>> from enum import Enum #导入模块中的类 >>> class Color(Enum): #创建自定义枚举类 red = 1 b...

3038
来自专栏Go入门系列

Golang 入门系列(二)Go语言基础语法及需要注意的坑

上一章节我们已经了解了 Go 环境的配置,不了解的,请查看前面的文章 https://www.cnblogs.com/zhangweizhong/p/94599...

70
来自专栏zhangdd.com

nginx location匹配规则

~      #波浪线表示执行一个正则匹配,区分大小写 ~*    #表示执行一个正则匹配,不区分大小写 ^~    #^~表示普通字符匹配,如果该选项匹配...

774
来自专栏向治洪

React 语法之let和const命令

let命令 基本用法 ES6新增了let命令,用来声明变量。它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效。 { let a = ...

2595
来自专栏Crossin的编程教室

【Python 第37课】 字典

今天介绍一个python中的基本类型--字典(dictionary)。 字典这种数据结构有点像我们平常用的通讯录,有一个名字和这个名字对应的信息。在字典中,名字...

32811
来自专栏Python小屋

Python中的枚举类型

>>> from enum import Enum #导入模块中的类 >>> class Color(Enum): #创建自定义枚举类 red = 1...

2845

扫码关注云+社区