命名空间namespace的用法
来源:互联网 发布:如何用支付宝付款淘宝 编辑:程序博客网 时间:2024/05/17 03:18
using关键字
如果在程序中需要多次引用某个命名空间的成员,那么按照之前的说法,我们每次都要使用范围解析符来指定该命名空间,这是一件很麻烦的事情。为了解决这个问题,人们引入了using关键字。using语句通常有两种使用方式:
using namespace 命名空间名称; using 命名空间名称::成员;
第一种形式中的命名空间名称就是我们要访问的命名空间。该命名空间中的所有成员都会被引入到当前范围中。也就是说,他们都变成当前命名空间的一部分了,使用的时候不再需要使用范围限定符了。第二种形式只是让指定的命名空间中的指定成员在当前范围中变为可见。我们用前面的CounterNameSpace来举例,下面的using语句和赋值语句都是有效的:
using CounterNameSpace::lowerbound; //只有lowerbound当前是可见的lowerbound = 10; //这样写是合法的,因为lowerbound成员当前是可见的using CounterNameSpace; //所有CounterNameSpace空间的成员当前都是可见的upperbound = 100; //这样写是合法的,因为所有的CounterNameSpace成员目前都是可见的
当我们用using引入一个命名空间的时候,如果之前有引用过别的命名空间(或者同一个命名空间),则不会覆盖掉对之前的引入,而是对之前引入内容的补充。也就是说,到最后,上述程序中的std和CounterNameSpace这两个命名空间都变成全局空间了。
std命名空间
标准C++把自己的整个库定义在std命名空间中。这就是本书的大部分程序都有下面代码的原因:
using namespace std;
这样写是为了把std命名空间的成员都引入到当前的命名空间中,以便我们可以直接使用其中的函数和类,而不用每次都写上std::。
当然,我们是可以显示地在每次使用其中成员的时候都指定std::,只要我们喜欢。例如,我们可以显示地采用如下语句指定cout:
std::cout << “显示使用std::来指定cout”;
如果我们的程序中只是少量地使用了std命名空间中的成员,或者是引入std命名空间可能导致命名空间的冲突的话,我们就没有必要使用using namespace std;了。然而,如果在程序中我们要多次使用std命名空间的成员,则采用using namespace std;的方式把std命名空间的成员都引入到当前命名空间中会显得方便很多,而不用每次都单独在使用的时候显示指定
#include <conio.h> #include <iostream.h> namespace car // 名空间的定义 { int model; int length; int width; } namespace plane { int model; namespace size // 名空间的嵌套 { int length; int width; } } namespace car // 添加名空间的成员 { char * name; } namespace c=car; // 定义名空间的别名 int Time; // 外部变量属于全局名空间 void main() { car::length=3; // 下面一句错误,故屏蔽掉 // width=2; // 对于非全局变量和当前有效临时变量应该指定名空间 plane::size::length=70; cout<<"the length of plane is "<<plane::size::length<<"m."<<endl; cout<<"the length of car is "<<car::length<<"m."<<endl; // 使用名空间的别名 cout<<"the length of c is "<<c::length<<"m."<<endl; int Time=1996; // 临时变量,应区别于全局变量 ::Time=1997; cout<<"Temp Time is "<<Time<<endl; cout<<"Outer Time is "<<::Time<<endl; // 使用关键字using using namespace plane; model=202; size::length=93; cout<<model<<endl; cout<<size::length<<endl; getch(); }
运行结果:
the length of plane is 70m. the length of car is 3m. the length of c is 3m. Temp Time is 1996 Outer Time is 1997
说明:
1. 从上面可以看出,名空间定义了一组变量和函数,它们具有相同的作用范围。对于不同的
2. 名空间可以被嵌套定义,使用时要逐级对成员用名空间限定符:
3. 系统默认有一个全局名空间,它包含了所有的外部变量。这个名空间没有名字,引用这个名空间里的变量时要使用名空间限定符:
4.
在前面的例程中可以看到,为了使用时的方便,又引入了关键字using。利用using声明可以在引用名空间成员时不必使用名空间限定符::。此外,关键字namespace和using的使用,对函数重载有一定的影响。
下面通过例程进行具体说明。
#include <conio.h> #include <iostream.h> namespace car // 名空间的定义 { void ShowLength(double len) // 参数类型为d o u b l e { cout<<"in car namespace: "<<len<<endl; } } namespace plane // 名空间的定义 { void ShowLength(int len) // 参数类型为i n t { cout<<"in plane namespace: "<<len<<endl; } } void main() { using namespace car; ShowLength(3); ShowLength(3.8); using namespace plane; ShowLength(93); ShowLength(93.75); getch(); }
运行结果:
<span style="color:#333333;">in car namespace: 3 in car namespace: 3.8 in plane namespace: 93 in car namespace: 93.75 </span>
// 定义一个模拟名字空间的结构,结构内部包含widgets的类型// 和函数。widgets对象支持operator+进行加法运算struct widgets { class widget { ... }; static const widgetoperator+(const widget& lhs,constwidget& rhs); ...};// 为上面所述的widge和operator+ 建立全局(无修饰符的)名称typedef widgets::widget widget;const widget (* const operator+)(constwidget&, // 错误! constwidget&); // operator+不能是指针名 widget w1, w2, sum;sum = w1 +w2; // 错误! 本空间没有声明 // 参数为widgets 的operator+sum = widgets::operator+(w1,w2); // 合法, 但不是"自然"的语法
std::cout << std::hex << 3.4 << std::endl;
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"
- 命名空间namespace的用法
- C++ 命名空间namespace的各种用法
- php 的 namespace(命名空间)的用法及说明
- C++命名空间namespace的理解和用法
- C++ Namespace命名空间和static的用法总结
- PHP命名空间 namespace 及导入 use 的用法
- Namespace(命名空间)的使用
- 命名空间namespace的使用
- namespace命名空间的使用
- NameSpace命名空间的学习
- 命名空间namespace的作用
- C++的命名空间 namespace
- c++的命名空间namespace的作用
- Javascript的命名空间namespace个人体会
- struts2.0的命名空间namespace
- JS--命名空间的理解(namespace)
- Ext.namespace 命名空间的解析
- namespace命名空间成员类的声明
- Android 开源框架Universal-Image-Loader的使用
- 普通用户授予select any table 权限
- DM6437 DSP系列之启动过程全析
- 位操作
- 如何与移动开发者交谈 给测试员的六条建议
- 命名空间namespace的用法
- Ubuntu下MySQL不能远程登录的解决
- 战斗中的取消:《战神》与动作游戏设计 -
- 使用Camera功能 AREA的理解
- JNI/NDK开发指南(三)——JNI数据类型及与Java数据类型的映射关系
- NAND Flash启动的问题
- Android universal image Loader for android
- CentOS6.3安装VBoxAdditions
- view刷新:invadicate()和postInvadicate()的区别