C++命名空间 namespace的作用和使用解析

本文内容来源于:http://blog.sina.com.cn/s/blog_af68a2c201015pqo.html。

本人对其进行整理,列出其目录并摘录主要内容。

主要内容包括:

一、为什么需要命名空间?

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

二、什么是命名空间?

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

如: 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++中命名空间的作用类似于操作系统中的目录和文件的关系,由于文件很多,不便管理,而且容易重名,于是人们设立若干子目录,把文件分别放到不同的子目录中,不同子目录中的文件可以同名。调用文件时应指出文件路径。


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

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

·常量;

·(可以是定义或声明)

·结构体;

·类;

·模板;

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

例如

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; //需要指定外层的和内层的命名中间名

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


三、使用命名空间解决名字冲突。

http://blog.sina.com.cn/s/blog_af68a2c201015pqo.html

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

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

命名空间名::命名空间成员名

1 、使用命名空间别名 namespace TV=Television; //别名TV与原名Television等价

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

using后面的命名空间成员名必须是由命名空间限定的名字。例如:

using nsl::Student;

以上语句声明:在本作用域(using语句所在的作用域)中会用到命名空间ns1中的成员Student,在本作用域中如果使用该命名空间成员时,不必再用命名空间限定。例如在用上面的using声明后,在其后程序中出现的Student就是隐含地指nsl::Student。

using声明的有效范围是从using语句开始到using所在的作用域结束。

3、使用using namespace命名空间名

用上面介绍的using命名空间成员名,一次只能声明一个命名空间成员,如果在一个命名空间中定义了10个实体,就需要使用10次using命名空间成员名。能否在程序中用一个语句就能一次声明一个命名空间中的全部成员呢?

C++提供了using namespace语句来实现这一目的。using namespace语句的一般格式为

using namespace 命名空间名;

例如

using nanlespace nsl;

声明了在本作用域中要用到命名空间nsl中的成员,在使用该命名空间的任何成员时都不必用命名空间限定。


五、无名的命名空间

六、标准命名空间std

为了解决C++标准库中的标识符与程序中的全局标识符之间以及不同库中的标识符之间的同名冲突,应该将不同库的标识符在不同的命名空间中定义(或声明)。标准C++库的所有的标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(如iostream)中函数、类、对象和类模板是在命名空间 std中定义的。std是standard(标准)的缩写,表示这是存放标准库的有关内容的命名空间。

这样,在程序中用到C++标准库时,需要使用std作为限定。如

std::cout<<"OK."<<endl; //声明cout是在 命名空间std中定义的流对象

在有的C++书中可以看到这样的用法。但是在每个cout,cm以及其他在std中定义的标识符前面都用命名空间std作为限定,显然是很不方便的。在大多数的C++程序中常用usmgnamespace语句对命名空间std进行声明,这样可以不必对每个命名空间成员一进行处理,在文件的开头加入以下 using namespace声明:

using namespace std;

这样,在std中定义和声明的所有标识符在本文件中都可以作为全局量来使用。但是应当绝对保证在程序中不出现与命名空间std的成员同名的标识符,例如在程序中不能再定义一个名为cout的对象。由于在命名空间std中定义的实体实在太多,有时程序设计人员也弄不请哪些标识符已在命名空间std中定义过,为减少出错机会,有的专业人员喜欢用若干个"using命名空间成员”声明来代替“using namespace命名空间”声明,如

using Std::string;

using Std::cout;

using Std::cin;

等。为了减少在每一个程序中都要重复书写以亡的using声明,程序开发者往往把编写应用程序时经常会用到的命名空间std成员的usmg声明组成一个头文件,然后在程序中包含此头文件即可。

七、使用早期的函数库


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++中自定义命名空间(namespace)的作用是为了避免命名冲突,类似于文件夹的概念,可以将相似的变量、函数、类等放在一个命名空间中进行管理。在一个命名空间中定义的名称只在该命名空间中有效,不会与其他命名空间中定义的名称发生冲突。 C++中自定义命名空间使用方法有三种,分别是: 1.使用命名空间前缀,即在变量、函数、类等前加上命名空间的名称和作用解析符(::),例如:`spaceA::aaa`。 2.使用using声明,即使用`using namespace 命名空间名`声明使用命名空间,例如:`using namespace spaceA`。 3.使用using编译指令,即在代码中使用`using 命名空间名::名称`的方式声明使用命名空间,例如:`using spaceA::aaa`。 下面是一个使用using声明的例子:[^1] ```c++ #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; namespace spaceA { // 自定义命名空间spaceA int aaa = 10; } using spaceA::aaa; // 声明命名空间spaceA中的变量aaa int main() { // 使用using声明的方式访问命名空间中定义的变量 cout << aaa << endl; // 输出:10 return 0; } ``` 下面是一个使用命名空间前缀的例子: ```c++ #define _CRT_SECURE_NO_WARNINGS 1 #include<iostream> using namespace std; namespace spaceA { // 自定义命名空间spaceA int aaa = 10; } int main() { // 使用命名空间前缀的方式访问命名空间中定义的变量 cout << spaceA::aaa << endl; // 输出:10 return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值