什么是名称空间

2013-11-04   来源:外语类

什么是命名空间 命名空间的范围
篇一:什么是名称空间

  命名空间是用来组织和重用代码的,那么你对命名空间了解多少呢?以下是由小编整理关于什么是命名空间的内容,希望大家喜欢!

  命名空间的解析

  NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了。为了解决这个问题,引入了名字空间这个概念,通过使用 namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。

  通常来说,命名空间是唯一识别的一套名字,这样当对象来自不同的地方但是名字相同的时候就不会含糊不清了。使用扩展标记语言的时候,XML的命名空间是所有元素类别和属性的集合。元素类别和属性的名字是可以通过唯一XML命名空间来唯一。

  在XML里,任何元素类别或者属性因此分为两部分名字,一个是命名空间里的名字另一个是它的本地名。在XML里,命名空间通常是一个统一资源识别符(URI)的名字。而URI只当名字用。主要目的是为了避免名字的冲突。

  命名空间的范围

  所谓namespace,是指标识符的各种可见范围。C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。

  一 :<iostream>和<iostream.h>格式不一样,前者没有后缀,实际上,在你的编译器include文件夹里面可以看到,二者是两个文件,打开文件就会发现,里面的代码是不一样的。后缀为.h的头文件c++标准已经明确提出不支持了,早些的实现将标准库功能定义在全局空间里,声明在带.h后缀的头文件里,c++标准为了和C区别开,也为了正确使用命名空间,规定头文件不使用后缀.h。 因此,当使用<iostream.h>时,相当于在c中调用库函数,使用的是全局命名空间,也就是早期的c++实现;当使用<iostream>的时候,该头文件没有定义全局命名空间,必须使用namespace std;这样才能正确使用cout。

  二: 由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

  1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl;

  2、使用using关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << 3.4 << endl;

  3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。那么以上语句可以如下写: cout <<hex << 3.4 << endl;因为标准库非常的庞大,所以程序员在选择的类的名称或函数名时就很有可能和标准库中的某个名字相同。所以为了避免这种情况所造成的名字冲突,就把标准库中的一切都被放在名字空间std中。但这又会带来了一个新问题。无数原有的C++代码都依赖于使用了多年的伪标准库中的功能,他们都是在全局空间下的。所以就有了<iostream.h>和<iostream>等等这样的头文件,一个是为了兼容以前的C++代码,一个是为了支持新的标准。命名空间std封装的是标准程序库的名称,标准程序库为了和以前的头文件区别,一般不加".h"

  命名空间的分类

  在struts2中

  在struts2里,namespace是package里的一个属性,用来标记action的访问路径。注意:只有package的namespace才能标记路径而不是name属性。在struts2里,存在着一个是默认namespace-"",若package不指定namespace,则package里的action就使用默认namespace。若访问action时没有指定namespace则struts2会先在根namespace-"/"里查找action,找不到再到默认namespace里查找action。再找不到就会报错,也就是说struts2只会查找两层namespace。

  在XML中

  命名空间提供避免元素命名冲突的方法。

  命名冲突

  在 XML(标准通用标记语言下的一个子集) 中,元素名称是由开发者定义的,当两个不同的文档使用相同的元素名时,就会发生命名冲突。

  这个 XML 文档携带着某个表格中的信息:

  <table>

  <tr>

  <td>Apples</td>

  <td>Bananas</td>

  </tr>

  </table>

  这个 XML 文档携带有关桌子的信息(一件家具):

  <table>

  <name>African Coffee Table</name>

  <width>80</width>

  <length>120</length>

  </table>

  假如这两个 XML 文档被一起使用,由于两个文档都包含带有不同内容和定义的 <table> 元素,就会发生命名冲突。

  XML 解析器无法确定如何处理这类冲突。

  使用前缀来避免命名冲突

  此文档带有某个表格中的信息:

  <h:table>

  <h:tr>

  <h:td>Apples</h:td>

  <h:td>Bananas</h:td>

  </h:tr>

  </h:table>

java中命名空间是什么
篇二:什么是名称空间

  命名空间是用来组织和重用代码的[1] 。如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象,对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了,为了解决这个问题,引入了名字空间这个概念,通过使用 namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。

  名字管理对任何程序设计语言来说,都是一个重要问题。如果你在程序的某个模块里使用了一个名字,而其他人在这个程序的另一个模块里也使用了相同的名字,那么怎样才能区分这两个名字并防止二者互相冲突呢?这个问题在 C 语言中尤其严重,因为程序往往包含许多难以管理的名字。C++类( Java 类基于此)将函数包于其内,从而避免了与其它类中的函数名冲突。然而,C++仍允许全局数据和全局函数的存在,所以还是有可能发生冲突。为了解决这个问题,C++通过几个关键字,引入了“名字空间”的概念。

  Java 采用了一种全新的方法,能够避免上述所有问题。为了给一个类库生成不会与其它名字混淆的名字,Java 采用了与 Internet域名相似的指定符。实际上,Java设计者希望程序员反过来使用自己的 Internet域名,因为这样可以保证它们肯定是独一无二的。由于我的域名是BruceEckel.com ,所以我的各种奇奇怪怪的应用工具类库就被命名为com.bruceeckel.utility.foibles。反转域名后,句点就用来代表子目录的划分。

  设计者们发现这样

  做会引起一些问题,因此,现在整个包名都是小写了。

  Java2 的这种机制意味着所有的文件都能够自动存活于它们自己的名字空间内,而且同一个文件内的每个类都有唯一的标识符。所以不必学习特殊的语言知识来解决这个问题——Java语言本身已经为你解决了这个问题。

  根据反转域名得到相应的命名空间的灵感大笑

  运用其它构件

  如果你想在自己的程序里使用预先定义好的类,那么编译器就必须知道怎么定位它们。当然,这个类可能就在发出调用的那个源文件中;在这种情况下,你就可以直接使用这个类——即使这个类在文件的后面才会被定义(Java 消除了“向前引用”问题,故不必考虑它)。

  如果那个类位于其它文件中,又会怎样呢?你可能会认为编译器应该有足够的智慧,能够直接找到它的位置。但事实并非如此。想象下面的情况,如果你想使用一个特定名字的类,但其定义却不止一份(假设这些定义各不相同)。更糟糕的是,假设你正在写一个程序,在构建过程中,你想将某个新类添加到类库中,但却与已有的某个类名冲突。

  为了解决这个问题,你必须消除所有可能的混淆情况。为实现这个目的,你可以使用关键字import 来准确地告诉编译器你想要的类是什么。Import 指示编译器导入一个包,也就是一个类库(在其它语言中,一个库不仅包含类,还可能包括方法和数据;但是 Java 中的所有的代码都必须写在类里)。

  大多时候,我们使用与编译器附在一起的 Java 标准类库里的构件。有了这些构件,你就不必写一长串的反转域名。举例来说,只须像下面这么书写就行了:import java.util.ArrayList;

  这行代码告诉编译器,你想使用 Java 的 ArrayList类。但是,util 包含了数量众多的类,有时你想使用其中的几个,同时又不想明确地逐一声明。那么你可以使用通配符“*”来很容

  易地实现这个目的:

  import java.util.*;

  用这种方法一次导入一群类的方式倒是比一个一个地导入类的方式更常用。

Win10打开组策略总是弹出命名空间窗口怎么办
篇三:什么是名称空间

  Win10系统专业版中自带了组策略编辑器,最近有些用户反映他们打开组策略编辑器后,总是弹出一个窗口提示“命名空间……已经被定义为存储中另一文件的目标命名空间”。这个时候该怎么办呢?下面小编就为大家介绍一下具体的方法吧,欢迎大家参考和学习。

  具体的故障现象如下图所示:

  我们可以根据这个对话框给出的内容顺藤摸瓜,找出问题的根源,然后加以解决。

  具体方法如下:

  1、进入C:\Windows\PolicyDefinitions,找到Microsoft-Windows-Geolocation-WLPAdm.admx文件并删除;

  2、如果由于权限问题无法删除(如上图),可利用软媒魔方的设置大师为鼠标右键菜单加入“管理员取得所有权”功能;

  3、再次进入第1步位置,找到需要删除的文件,在该文件上点击右键,选择“管理员取得所有权”;

  4、执行“夺权”后,再次删除该文件(把握起见可将其放入回收站)。

  以上就是小编为大家整理的Win10组策略总是弹出命名空间窗口怎么办的全部内容了,只要删除提示中的文件,就可以解决组策略弹窗的问题了,希望可以帮到大家。

为什么需要命名空间
篇四:什么是名称空间

3: 为什么需要命名空间

一、 为什么需要命名空间(问题提出)

命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中常见的同名冲突。

在C语言中定义了3个层次的作用域,即文件(编译单元)、函数和复合语句。C++又引入了类作用域,类是出现在文件内的。在不同的作用域中可以定义相同名字的变量,互不于扰,系统能够区别它们。

1、全局变量的作用域是整个程序,在同一作用域中不应有两个或多个同名的实体(enuty),包括变量、函数和类等。

例:如果在文件中定义了两个类,在这两个类中可以有同名的函数。在引用时,为了区别,应该加上类名作为限定:

class A //声明A类

{ public:

void funl();//声明A类中的funl函数

private:

int i; };

void A::funl() //定义A类中的funl函数

{…………}什么是命名空间,命名空间的范围

class B //声明B类

{ public:

void funl(); //B类中也有funl函数

void fun2(); };

void B::funl() //定义B类中的funl函数

{ …………}

这样不会发生混淆。

在文件中可以定义全局变量(global variable),它的作用域是整个程序。如果在文件A中定义了一个变量a int a=3;

在文件B中可以再定义一个变量a int a=5;

在分别对文件A和文件B进行编译时不会有问题。但是,如果一个程序包括文件A和文件B,那么在进行连接时,会报告出错,因为在同一个程序中有两个同名的变量,认为是对变量的重复定义。

可以通过extern声明同一程序中的两个文件中的同名变量是同一个变量。如果在文件B中有以下声明:

extem int a;

表示文件B中的变量a是在其他文件中已定义的变量。由于有此声明,在程序编译和连接后,文件A的变量a的作用域扩展到了文件B。如果在文件B中不再对a赋值,则在文件B中用以下语句输出的是文件A中变量a的值: cout<<a; //得到a的值为3

2、程序中就会出现名字冲突。

在简单的程序设计中,只要人们小心注意,可以争取不 发生错误。但是,一个大型的应用软件,

往往不是由一个人独立完成的,而是由若干人合作完成的,不同的人分别完成不同的部分,最后组合成一个完整的程序。假 如不同的人分别定义了类,放在不同的头文件中,在主文件(包含主函数的文件)需要用这些类时,就用#include命令行将这些头文件包含进来。由于各头 文件是由不同的人设计的,有可能在不同的头文件中用了相同的名字来命名所定义的类或函数。

例4 名字冲突

程序员甲在头文件headerl.h中定义了类Student和函数fun。

//例4中的头文件header1(头文件1,没其文件名为cc8-4-h1.h)

#include <string>

#include <cmath>

using namespace std;

class Student //声明Student类

{ public:

Student(int n,string nam,int a)

{ num=n;name=nam;age=a;}

void get_data();

private:

int num;

string name;

int age; };

void Student::get_data() //成员函数定义

{ cout<<num<<" "<<name<<" "<<age<<endl; }

double fun(double a,double b)//定义全局函数(即外部函数)

{ return sqrt(a+b);}

在main函数所在的文件中包含头文件headerl.h:

#include <iostream>

using namespace std;

#include "header1.h" //注意要用双引号,因为文件一般是放在用用户目录中的

int main()

{ Student stud1(101,"Wang",18); //定义类对象studl

stud1.get_data();

cout<<fun(5,3)<<endl;

return 0; }

程序能正常运行,输出为

101 Wang 18

2.82843

如果程序员乙写了头文件header2.h,在其中除了定义其他类以外,还定义了类Student和函数fun,但其内容与头文件headerl.h中的Student和函数fun有所不同。

//例4中的头文件header2

#include <string>

#include <cmath>

using namespace std;

class Student //声明Student类

{ public:

Student(int n,string nam,char s) //参数与headerl中的student不同

{ num=n;name=nam;sex=s;}

void get_data();

private:

int num;

string name;

char sex; };//此项与headerl不同

void Student::get_data() //成员函数定义

{ cout<<num<<" "<<name<<" "<<sex<<endl; }

double fun(double a,double b) //定义全局函数

{ return sqrt(a-b);} //返回值与headerl中的fun函数不同

//头文件2中可能还有其他内容

假 如主程序员在其程序中要用到headerl.h中的Student和函数fun,因而在程序中包含了头文件headerl.h,同时要用到头文件 header2.h中的一些内容(但对header2.h中包含与headerl.h中的Student类和fun函数同名而内容不同的类和函数并不知 情,因为在一个头文件中往往包含许多不同的信息,而使用者往往只关心自己所需要的部分,而不注意其他内容),因而在程序中又包含了头文件 header2.h。如果主文件(包含主函数的文件)如下:

#include <iostream>

using namespace std;

#include "header1.h"//包含头文件l

#include "header2.h"//包含头文件2

int main()

{ Student stud1(101,"Wang",18);

stud1.get_data();

cout<<fun(5,3)<<endl;

return 0; }

这时程序编译就会出错。因为在预编译后,头文件中的内容取代了对应的#include命令行,这样就在同一个程序文件中出现了两个Student类和两个fun函数,显然是重复定义,这就是名字冲突,即在同一个作用域中有两个或多个同名的实体。

3、全局命名空间污染(global namespace pollution)。

在程序中还往往需要引用一些库(包括C++编译系统提供的库、由软件开发商提供的库或者用户自己开发的库),为此需要包含有关的头文件。如果在这些库中包含有与程序的全局实体同名的实体,或者不同的库中有相同的实体名,则在编译时就会出现名字冲突。

为 了避免这类问题的出现,人们提出了许多方法,例如:将实体的名字写得长—些(包含十几个或

几十个字母和字符);把名字起得特殊一些,包括一些特殊的字符; 由编译系统提供的内部全局标识符都用下划线作为前缀,如_complex(),以避免与用户命名的实体同名;由软件开发商提供的实体的名字用特定的字符作 为前缀。但是这样的效果并不理想,而且增加了阅读程序的难度,可读性降低了。

C 语言和早期的C++语言没有提供有效的机制来解决这个问题,没有使库的提供者能够建立自己的命名空间的工具。人们希望ANSI C++标准能够解决这个问题,提供—种机制、一种工具,使由库的设计者命名的全局标识符能够和程序的全局实体名以及其他库的全局标识符区别开来。

二、 什么是命名空间(解决方案)

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

如: namespace ns1 //指定命名中间nsl

{ int a;

double b; }

namespace是定义命名空间所必须写的关键字,nsl是用户自己指定的命名空间的名字(可以用任意的合法标识符,这里用ns1是因为ns是namespace的缩写,含义请楚),在花括号内是声明块,在其中声明的实体称为命名空间成员(namespace member)。现在命名空间成员包括变量a和b,注意a和b仍然是全局变量,仅仅是把它们隐藏在指定的命名空间中而已。如果在程序中要使用变量a和b,必须加上命名空间名和作用域分辨符“::”,如nsl::a,nsl::b。这种用法称为命名空间限定(qualified), 这些名字(如nsl::a)称为被限定名(qualified name)。C++中命名空间的作用类似于操作系统中的目录和文件的关系,由于文件很多,不便管理,而且容易重名,于是人们设立若干子目录,把文件分别放 到不同的子目录中,不同子目录中的文件可以同名。调用文件时应指出文件路径。

命名空间的作用:是建立一些互相分隔的作用域,把一些全局实体分隔开来。以 免产生老点名叫李相国时,3个人都站起来应答,这就是名字冲突,因为他们无法辨别老师想叫的是哪一个李相国,同名者无法互相区分。为了避免同名混淆,学校 把3个同名的学生分在3个班。这样,在小班点名叫李相国时,只会有一个人应答。也就是说,在该班的范围(即班作用域)内名字是惟一的。如果在全校集合时校 长点名,需要在全校范围内找这个学生,就需要考虑作用域问题。如果校长叫李相国,全校学生中又会有3人一齐喊“到”,因为在同一作用域中存在3个同名学 生。为了在全校范围内区分这3名学生,校长必须在名字前加上班号,如高三甲班的李相国,或高三乙班的李相国,即加上班名限定。这样就不致产生混淆。

可 以根据需要设置许多个命名空间,每个命名空间名代表一个不同的命名空间域,不同的命名空间不能同名。这样,可以把不同的库中的实体放到不同的命名空间中, 或者说,用不同的命名空间把不同的实体隐蔽起来。过去我们用的全局变量可以理解为全局命名空间,独立于所有有名的命名空间之外,它是不需要用 namespace声明的,实际上是由系统隐式声明的,存在于每个程序之中。

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

·变量(可以带有初始化);

·常量;

·数(可以是定义或声明);

·结构体;

·类;

·模板;什么是命名空间,命名空间的范围

·命名空间(在一个命名空间中又定义一个命名空间,即嵌套的命名空间)。

例如

namespace nsl

{ const int RATE=0.08; //常量

doublepay; //变量

doubletax() //函数

{return a*RATE;}

namespacens2 //嵌套的命名空间

{int age;}

}

如果想输出命名空间nsl中成员的数据,可以采用下面的方法:

cout<<nsl::RATE<<endl;

cout<<nsl::pay<<endl;

cout<<nsl::tax()<<endl;

cout<<nsl::ns2::age<<endl; //需要指定外层的和内层的命名中间名

可以看到命名空间的声明方法和使用方法与类差不多。但它们之间有一点差别:在声明类时在右花括号的后面有一分号,而在定义命名空间时,花括号的后面没有分号。

三、 使用命名空间解决名字冲突(使用指南)

有了以上的基础后,就可以利用命名空间来解决名字冲突问题。现在,对例4程序进行修改,使之能正确运行。

例5 利用命名空间来解决例4程序名字冲突问题。

修改两个头文件,把在头文件中声明的类分别放在两个不同的命名空间中。

//例8.5中的头文件1,文件名为header1.h

using namespace std;

#include <string>

#include <cmath>

namespace ns1 //声明命名空间ns1

{ class Student //在命名空间nsl内声明Student类

{ public:

Student(int n,string nam,int a)

{ num=n;name=nam;age=a;}

void get_data();

private:

int num;什么是命名空间,命名空间的范围

string name;

int age; };

void Student::get_data() //定义成员函数

{ cout<<num<<" "<<name<<" "<<age<<endl; }

double fun(double a,double b) //在命名空间n引内定义fun函数

{ return sqrt(a+b);}

}

//例8.5中的头文件2,文件名为header2.h

#include <string>

#include <cmath>

namespace ns2 //声明命名空间ns2

{ class Student

{ public:

C#2010 定义命名空间
篇五:什么是名称空间

C#2010 定义命名空间

命名空间是.NET Framework开发的基础,是所有标识符(如类)的命名容器。两个同名的标识符如分别存在于两个不同的命名空间中,则相互不会发生混淆。开发者除了可使用.NET Framework自带的各种命名空间外,还可以自定义命名空间,对类进行重新组织。

在定义命名空间时,需要使用namespace关键字来对命名空间进行声明,此命名空间范围允许用户组织代码,并允许创建类、属性和方法。定义命名空间时需要遵循以下规则。

 命名空间名可以是任何合法的标识符,其可包含字母、数字、下划线“_”、中文、英文句号“.”。

 即使未显示声明命名空间,.NET Framework也会自动创建一个默认的命名空间,该未命名的命名空间(即全局命名空间)存在于每一个.NET程序中。全局命名空间中的任何标识符都可以用于命名的命名空间中。

 命名空间隐式具有公共访问权,且不可修改

 .NET Framework允许在两个或更多的声明中定义一个命名空间

例如,定义一个销售服装商品的命名空间,在其中定义服装和裤子两个类,裤子的类继承服装的各种属性,代码如下。 //定义商品的命名空间

namespace goods

{

//定义服装的类

public class clothes

{

//定义服装的各种属性

public int gid;

public float price;

public String name;

//定义服装的构造函数

public clothes(int gid,float price,String name)

{

//引用构造函数的参数作为属性值

this.gid = gid;

this.price = price;

this.name = name;

}

第二十七节 命名空间的含义
篇六:什么是名称空间

第二十七节 命名空间的含义

1、声明say 命名空间

package{

//命名sayone

public namespace sayone{

}

}

2、声明ball 命名空间

package{

//命名ball

public namespace ball{

}

}

3、定义kongjian类

package

{

//导入命名空间

import sayone;

//导入命名空间

import ball;

//打开命名空间

use namespace sayone;

//打开命名空间

use namespace ball;

//导入Sprite父类

import flash.display.Sprite;

//定义kongjian类并继承Sprite类 public class kongjian extends Sprite {

//定义sayone方法

sayone function da():void {

trace("a");

}

//定义ball 方法

ball function da():void

{

trace("b");

}

4、定义main 类

package

{

import kongjian;

import ball;

import say;

import flash.display.Sprite;

public class main extends Sprite {

public function main():void {

use namespace say;

var foo:kongjian=new kongjian(); foo.da();

}

}

}

}

}

5、在flash文件类中加入main类

6、输出结果:a

什么是名称空间

http://m.myl5520.com/shitiku/64322.html

展开更多 50 %)
分享

热门关注

哈尔滨工业大学2023年外语类保送生招生简章精选三篇

外语类

北京大学2023外语类专业保送生招生简章四篇

外语类

北京师范大学2023年外语类保送生招生简章精选四篇

外语类

北京师范大学2023外语类保送生招生简章发布锦集四篇

外语类

2023北京师范大学外语类保送生招生简章精选三篇

外语类

2023同济大学外语类保送生招生简章范文(精选3篇)

外语类

山东大学2023年外语类保送生报名条件及招生计划(通用4篇)

外语类

东南大学外国语学院

外语类

师范类专业就业前景

外语类

西南大学外国语学院

外语类