C++名称空间
2016-05-14 11:23
267 查看
使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲突。在C++中,变量、函数和类都是大量存在的。如果没有命名空间,这些变量、函数、类的名称将都存在于全局命名空间中,会导致很多冲突。比如,如果我们在自己的程序中定义了一个函数toupper(),这将重写标准库中的toupper()函数,这是因为这两个函数都是位于全局命名空间中的。命名冲突还会发生在一个程序中使用两个或者更多的第三方库的情况中。此时,很有可能,其中一个库中的名称和另外一个库中的名称是相同的,这样就冲突了。这种情况会经常发生在类的名称上。比如,我们在自己的程序中定义了一个Stack类,而我们程序中使用的某个库中也可能定义了一个同名的类,此时名称就冲突了。Namespace 关键字的出现就是针对这种问题的。由于这种机制对于声明于其中的名称都进行了本地化,就使得相同的名称可以在不同的上下文中使用,而不会引起名称的冲突。或许命名空间最大的受益者就是C++中的标准库了。在命名空间出现之前,整个C++库都是定义在全局命名空间中的(这当然也是唯一的命名空间)。引入命名空间后,C++库就被定义到自己的名称空间中了,称之为std。这样就减少了名称冲突的可能性。我们也可以在自己的程序中创建自己的命名空间,这样可以对我们认为可能导致冲突的名称进行本地化。这点在我们创建类或者是函数库的时候是特别重要的。命名空间基础namespace 关键字使得我们可以通过创建作用范围来对全局命名空间进行分隔。本质上来讲,一个命名空间就定义了一个范围。定义命名空间的基本形式如下:namespace 名称{//声明}在命名空间中定义的任何东西都局限于该命名空间内。
下面就是一个命名空间的例子,其中对一个实现简单递减计数器的类进行了本地化。在该命名空间中定义了计数器类用来实现计数;其中的upperbound和lowerbound用来表示计数器的上界和下界。
namespace myCounterNameSpace
{
int upperbound;
int lowerbound;
class counter
{
int count;
public:
void counter(int n)
{
if ( n <= upperbound )
{
count = n;
} else
{
count = upperbound;
}
}
void reset(int n)
{
if ( n < upperbound )
{
count = n;
}
}
int run()
{
if ( count > lowerbound)
{
return count--;
}
else
return lowerbound;
}
};
}
其中的upperbound,lowerbound和类counter都是有命名空间myCounterNameSpace定义范围的组成部分。在命名空间中声明的标识符是可以被直接引用的,不需要任何的命名空间的修饰符。例如,在myCounterNameSapce命名空间中,run()函数中就可以直接在语句中引用lowerbound:if(count >lower bound){
return count--;
}然而,既然命名空间定义了一个范围,那么我们在命名空间之外就需要使用范围解析运算符来引用命名空间中的对象。例如,在命名空间CounterNameSpace定义的范围之外给upperbound赋值为20,就必须这样写:myCounterNameSpace::upperbound = 20;或者在CounterNameSpace定义的范围之外想要声明一个counter类的对象就必须这样写:myCounterNameSpace::counter obj;一般来讲,在命名空间之外想要访问命名空间内部的成员需要在成员前面加上命名空间和范围解析运算符。下面的程序演示了如何使用myCounterNameSpace这个命名空间:#include <iostream>
using namespace std;
namespace myCounterNameSpace
{
int upperbound;
int lowerbound;
class counter
{
int count;
public:
void counter(int n)
{
if ( n <= upperbound )
{
count = n;
} else
{
count = upperbound;
}
}
void reset(int n)
{
if ( n < upperbound )
{
count = n;
}
}
int run()
{
if ( count > lowerbound)
{
return count--;
}
else
return lowerbound;
}
};
}
int main()
{
myCounterNameSpace::upperbound = 200;
myCounterNameSpace::lowerbound = 0;
myCounterNameSpace::counter ob1(20);
int i;
do {
i = ob1.run();
cout << i << " ";
} while (i > myCounterNameSpace::lowerbound);
cout << endl;
CounterNameSpace::counter ob2(30);
do {
i = ob2.run();
cout << i << " ";
} while (i > CounterNameSpace::lowerbound);
cout << endl;
ob2.reset(100);
do
{ i = ob2.run();
cout << i << " ";
} while (i > CounterNameSpace::lowerbound);
cout << endl;
return 0;
}
关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.
下面就是一个命名空间的例子,其中对一个实现简单递减计数器的类进行了本地化。在该命名空间中定义了计数器类用来实现计数;其中的upperbound和lowerbound用来表示计数器的上界和下界。
namespace myCounterNameSpace
{
int upperbound;
int lowerbound;
class counter
{
int count;
public:
void counter(int n)
{
if ( n <= upperbound )
{
count = n;
} else
{
count = upperbound;
}
}
void reset(int n)
{
if ( n < upperbound )
{
count = n;
}
}
int run()
{
if ( count > lowerbound)
{
return count--;
}
else
return lowerbound;
}
};
}
其中的upperbound,lowerbound和类counter都是有命名空间myCounterNameSpace定义范围的组成部分。在命名空间中声明的标识符是可以被直接引用的,不需要任何的命名空间的修饰符。例如,在myCounterNameSapce命名空间中,run()函数中就可以直接在语句中引用lowerbound:if(count >lower bound){
return count--;
}然而,既然命名空间定义了一个范围,那么我们在命名空间之外就需要使用范围解析运算符来引用命名空间中的对象。例如,在命名空间CounterNameSpace定义的范围之外给upperbound赋值为20,就必须这样写:myCounterNameSpace::upperbound = 20;或者在CounterNameSpace定义的范围之外想要声明一个counter类的对象就必须这样写:myCounterNameSpace::counter obj;一般来讲,在命名空间之外想要访问命名空间内部的成员需要在成员前面加上命名空间和范围解析运算符。下面的程序演示了如何使用myCounterNameSpace这个命名空间:#include <iostream>
using namespace std;
namespace myCounterNameSpace
{
int upperbound;
int lowerbound;
class counter
{
int count;
public:
void counter(int n)
{
if ( n <= upperbound )
{
count = n;
} else
{
count = upperbound;
}
}
void reset(int n)
{
if ( n < upperbound )
{
count = n;
}
}
int run()
{
if ( count > lowerbound)
{
return count--;
}
else
return lowerbound;
}
};
}
int main()
{
myCounterNameSpace::upperbound = 200;
myCounterNameSpace::lowerbound = 0;
myCounterNameSpace::counter ob1(20);
int i;
do {
i = ob1.run();
cout << i << " ";
} while (i > myCounterNameSpace::lowerbound);
cout << endl;
CounterNameSpace::counter ob2(30);
do {
i = ob2.run();
cout << i << " ";
} while (i > CounterNameSpace::lowerbound);
cout << endl;
ob2.reset(100);
do
{ i = ob2.run();
cout << i << " ";
} while (i > CounterNameSpace::lowerbound);
cout << endl;
return 0;
}
关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.
相关文章推荐
- c++文件的读取
- 如何成为一名高级C++程序员
- 【LeetCode】290. Word Pattern
- C++重载重写重定义
- c++开发ocx入门实践三--基于opencv的简易视频播发器ocx
- C++——中的虚函数(Virtual function)
- C++纯虚函数作为接口类举例
- C语言实现二叉树的递归遍历与非递归遍历
- 最小二乘法及C++实现
- C++多态
- c++ 内存申请释放,构造函数,析构函数,执行顺序
- C/C++ 堆与栈的区别
- HDU 2602-Bone Collector(01背包-一/二维)
- [C++]内存管理器--谈论如何自定义内存分配机制
- 成为C++高手之最终版计算器
- C++中关于set的自定义排序函数的书写
- 【C++】WMI获取系统硬件信息(CPU/DISK/NetWork etc)
- C++实现迷宫问题
- 汉诺塔问题
- 历届蓝桥杯C/C++决赛试题