C++之名字空间篇 ( 学习笔记)
C/C++    2009-09-30 20:11   阅读29   评论0  
字号:    

Namespaces

名字空间允许像类,对象和函数一样的一组实体归属于一个名称。把一个全局的范围化分成许多子的范围,每一个小的范围都有它自己的名字。
名字空间的格式是:
namespace identifier{
entities
}

包含在名字空间下的任何类,对象和函数中设立的实体必须是有效的标签符,例如:
namespace myNamespace{
int a, b;
}

这种情况,在被调用的名字空间 myNamespace 内部变量 a 和变量 b 被定义成了一个普通的变量,为了从 myNamespace 外部访问这些变量,我们必须使用作用域操作符 :: ,例如,从 myNamespace 外部访问前面定义的变量,我们要这样写:
general::a
general::b


名字空间的功能一个全局的对象或者函数像另外一个对象一样使用了同一个标识符时特别有用,会引起重定义的错误,例如:
//namespace
#include <iostream>
using namespace std;
namespace first{
int var = 5;
}
namespace second{
double var = 3.1416;
}
int main() {
cout << first::var << endl;
cout << second::var <<endl;
return 0;
}


程序运行如下:
5
3.1416


这种情况我们使用了两个相同名字的全局变量: var 。一个是被定义在 first 名字空间里的,另一个是被定义在 second 名字空间内的。因为有了名字空间所以没有发生重定义的错误。

using

使用 using 这个关键字是为了将一个来到名字空间内的名字介绍到当前声明的区域,例如:

//namespace
#include <iostream>
using namespace std;
namespace first{
int x = 5;
int y = 10;
}
namespace second{
double x = 3.1416;
double y = 2.7183;
}
int main() {
using first::x;
using second::y;
cout << x << endl;
cout << y <<endl;
cout <<first::y <<endl;
cout <<second::x <<endl;
return 0;
}


程序运行如下:

5
2.7183
10
3.1416


如何注意这段代码, x (没有任何名字空间标识符)是引用 first::x ,而 y 引用 second::y ,正是由于我们在前面指定了 using 这个声明,所以们仍然要使用标识符全名来访问 first::y second::x
关键字 using 也能直接指向一个实体名字空间。

//namespace
#include <iostream>
using namespace std;
namespace first{
int x = 5;
int y = 10;
}
namespace second{
double x = 3.1416;
double y = 2.7183;
}
int main() {
using namespace first;
cout << x << endl;
cout << y <<endl;
cout <<second::x <<endl;
cout <<second::y <<endl;
return 0;
}

程序运行如下:

5
10
3.1416
2.7183

这个情况,我们定义过 using namespace frist ,所有直接使用 xy 没有使用名字空间标识符而是引用了定义的名字空间 frist

usingusing namespace 仅仅是在同一个块里有效,它们规定在整个代码内,是否是在全局范围里直接使用,例如,如果我们打算首先使用一个名字空间的对象,再使用别外一个名字空间的对象,我们应该这样做:
//namespace
#include <iostream>
using namespace std;
namespace first{
int x = 5;
}
namespace second{
double x = 3.1416;
}
int main() {
using namespace first;{
cout << x << endl;
}{
using namespace second;
cout << x <<endl;
}
return 0;
}

程序运行如下:

5
3.1416

名字空间别名(Namespace alias)

我们能改变一个已经存在的名字空间的命名,相应的格式如下:

namespace new_name = current_name;

名字空间std (namespace std)

C++ 标准类库中的所有实体都定义在名字空间 std 中,这就是为什么我们通常需要包含一个 using namespace std ,描述在所有的程序中使用的实体都定义在 iostream 中。