深入理解命名空间

一、为什么使用命名空间

一个大型的工程往往是由若干个人独立完成的,不同的人分别完成不同的部分,最后再组合成一个完整的程序。由于各个头文件是由不同的人设计的,有可能在不同的头文件中用了相同的名字来命名所定义的类或函数,这样在程序中就会出现名字冲突。不仅如此,有可能我们自己定义的名字会与C++库中的名字发生冲突。

名字冲突就是在同一个作用域中有两个或多个同名的实体,为了解决命名冲突 ,C++中引入了命名空间,所谓命名空间就是一个可以由用户自己定义的作用域,在不同的作用域中可以定义相同名字的变量,互不干扰,系统能够区分它们。

二、什么是命名空间

命名空间是程序设计者命名的内存区域,程序设计者根据需指定一些有名字的空间域,把一些全局实体分别存放到各个命名空间中,从而与其他全局实体分隔开。

通俗的说,每个名字空间都是一个名字空间域,存放在名字空间域中的全局实体只在本空间域内有效。名字空间对全局实体加以域的限制,从而合理的解决命名冲突。

例:

namespace na

{

int a;

char c;

}

则 a和c只在na的作用域内有效。

在声明一个命名空间时,花括弧内不仅可以包含变量,而且还可以包含以下类型:

变量(可以带有初始化)

常量

函数(可以是定义或声明)

结构体

模板

命名空间(命名空间可以嵌套定义)

例:

namespacens1

{

int a;

char c = 10;

void fun();

int Add(int a, int b)

{

return a + b;

}

namespace ns2

{

int b;

}

}

注意,如果此时想输出b,则需要指定外层和内层的命名空间

cout<<ns1::ns2::b<<endl;

三、使用命名空间成员的方法

1、在引用命名空间成员时,要用命名空间名和作用域解析符对命名空间成员进行限定,以区别不同的命名空间中同名标识符。即  命名空间名::命名空间成员名

2、还可以给命名空间取别名

例:

namespace Television

{...}

namespace Tv=Television;

则Tv就是命名空间Television的别名,在以后用到Television的地方都可以用Tv进行替换。

3、使用using命名空间成员名

using后面的命名空间成员名必须是有命名空间限制的名字。

例:using ns1::a;

以上语句表明,在using的作用域内如果使用到ns1中的成员a,则不必再用命名空间限定。在以后的程序中如果用到a,则隐含的指ns1::a。  using声明的作用域是从using语句开始,到using所在的作用域结束。要注意,在同一作用域内用using声明的不同的命名空间的成员不能有同名的成员,否则会发生重定义。

4、使用using namespace 命名空间名

第三条介绍的using命名空间成员名,一次只能声明一个命名空间成员,如果一个命名空间中有多个变量,就需要多次使用using命名空间成员名。C++中还提供了using namespace 语句来实现一次声明一个命名空间内的全部成员。

例如:

using namespace ns1;

声明了在本作用域中要用到命名空间ns1中的成员,在使用该命名空间内的任何成员时都不必使用命名空间限定。在用using namespace声明的作用域中,命名空间ns1的成员好像在全局域中声明的一样,因此不用加命名限定。

4、无名的命名空间

例:

namespace

{

void fun();

}

由于没有名字,所以其它文件无法引用,它只能在本文件的作用域内有效,它的作用域使重无名命名空间声明开始到本文件结束。在本文件使用无名命名空间成员时不必用命名空间限定。其实无名命名空间和static是同样的道理,都是只在本文件内有效,无法被其它文件引用。

5、标准命名空间

C++库的所有标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(iostream)中的函数、类、对象和类模板是在命名空间std中定义的。所以在C++程序的一开始,就用using namespace对std进行全局声明。

时间: 2024-07-29 07:45:26

深入理解命名空间的相关文章

Atitit &#160;深入理解命名空间namespace &#160;java c# php js

Atitit  深入理解命名空间namespace  java c# php js 1.1. Namespace还是package1 1.2. import同时解决了令人头疼的include1 1.3. 在不支持ns的语言里面使用ns,前缀发1 1.4. 常用命名空间的统计(约150个)1 1.5. 命名空间2 1.5.1. 在struts2中2 1.6. Linux 就支持6种不同类型的命名空间.2 1.1. Namespace还是package 1.2. import同时解决了令人头疼的in

第一章 01 namespace 命名空间

一.什么是namespace? namesapce是为了防止名字冲突提供的一种控制方式. 当一个程序需要用到很多的库文件的时候,名字冲突有时无法避免.之前的解决思路是使用更长的变量名字,使用不方便. 二.命名空间的定义 1.namespace   空间名称 { 变量: 函数: 类: } 三.命名空间的特点 1.每个命名空间都有自己的作用域: 2.命名空间可以是不连续的,正像代码中的所列举的例子: 1.1 如何理解命名空间的作用域 1 namespace global_namespace{ 2 3

命名空间与程序集

刚开始写程序时,老是分不清命名空间和程序集两个概念,最直接的表现就是要使用的类.查找MSDN以后,又是添加程序集又是添加命名空间,虽然最后能达到目的,却从来没有认真理解命名空间和程序集这两个概念,更不清楚两者的联系和区别. 查了一些资料后明白: 命名空间是代码标识符的一种组织形式和具名容器,是一个逻辑概念. 程序集是代码编译后存储的组织形式,有具体的存储文件格式,通常是.dll或.exe扩展名. 命名空间与程序集

别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】

目录 1.什么是类的加载(类初始化) 2.类的生命周期 3.接口的加载过程 4.解开开篇的面试题 5.理解首次主动使用 6.类加载器 7.关于命名空间 8.JVM类加载机制 9.双亲委派模型 10.ClassLoader源码分析 11.自定义类加载器 12.加载类的三种方式 13.总结 14.特别注意 @ 前言 你是否真的理解java的类加载机制?点进文章的盆友不如先来做一道非常常见的面试题,如果你能做出来,可能你早已掌握并理解了java的类加载机制,若结果出乎你的意料,那就很有必要来了解了解j

Python 作用域和命名空间

Python Scopes and Namespaces A namespace is a mapping from names to objects. 命名空间是一个从名字到对象的映射(指向,明确的路径). Most namespaces are currently implemented as Python dictionaries. 大部分都是由字典dict(其他语言也称为hash)实现. 例子: the set of built-in names .放置内置函数的集合.模块中的全局名称:

用样式表格式化显示

本章目标:了解 XML 的应用范围 了解XML的文档结构 理解格式正规的 XML 文档的特点 熟悉有效的 XML 文档的编写规则 理解命名空间 本章重点:熟悉有效的 XML 文档的编写规则 本章难点:理解命名空间 一.    XML的应用范围 人类一直在不断地尝试改进自己的发明,其中也包括人类最伟大的发明--文字的构成.第一个文本处理系统是用纸笔记录文字.现在,计算机文本处理器已经取代了手工处理,它不仅包含原始文档,还负责设置格式.出版和管理.在这些方便的功能整合到字处理之前,是由排字工人遵循书

JAVA 不同类加载器命名空间的理解

            以前一直有这样一个疑惑: 都说在JAVA中,由不同类加载器加载的类在虚拟机中位于不同的命名空间下,不同命名空间下的类相互不可见. 这让我产生了一个迷惑:如果有一个类A使用了java.util.List类,为什么在运行时会没有错误.因为按照类加载的双亲委派机制,自己写的类A一般由系统类加载器加载,而java.util.List肯定是由启动类加载器(也叫Root类加载器)加载的,所以这两个类应该不在一个命名空间下.那在运行时为什么类A还 是能访问到java.util.List

由浅到深理解ROS(3)-命名空间

全局命名空间:/rosout前面的反斜杠“/”表明该节点名称属于全局命名空间.之所以叫做全局名称因为它们在任何地方(包括代码.命令行工具.图形界面工具等的任何地方)都可以使用.无论这些名称用作众多命令行工具的参数还是用在节点内部,它们都有明确的含义.这些名称从来不会产生二义性,也无需额外的上下文信息来决定名称指的哪个资源.如/turtle1/cmd_vel 由斜杠分开的一系列命名空间(namespace),每个斜杠代表一级命名空间.命名空间用于将相关的计算图源(节点.话题.服务和参数统称为计算图

关于命名空间的理解---iostream与iostream.h的区别

C++中为了避免名字定义冲突,特别引入了"名字空间的定义",即namespace.当代码中用<iostream.h>时,输出可直接引用cout<<x;<iostream.h>继承C语言的标准库文件,未引入名字空间定义,所以可直接使用. 当代码中引入<iostream>时(C++标准),输出需要引用std::cout<<x;如果还是按原来的方法就会有错,或者直接添加using namespace std; 实例: code1 #