一、名字空間的定義
名字空間除了系統定義的名字空間之外,還可以自己定義,定義名字空間用關鍵字“namespace”,使用名字空間時用符號“::”指定。
不指定名字空間的變數或函式都是當前名字空間下的變數或函式。
不定義名字空間的情況下,都屬於全局名字空間。
同一個名字空間可以定義多次。
#include<iostream>
using namespace std;
namespace na
{
void print(int n)
{
//與名字空間nb的函式名相同
cout << "na::print: " << n << endl;
}
}
namespace nb
{
void print(int n)
{
//與名字空間na的函式名相同
cout << "nb::print: " << n << endl;
}
}
namespace na //同一個名字空間可以定義多次
{
void print2(int a, int b)
{
print(a);
print(b);
}
}
int main ( )
{
na::print(3); 指定na下的print函式
na::print(4); 指定na下的print函式
na::print2(5, 6); 指定na下的print2函式
return 0;
}
二、using的使用
使用“using namespace”可以使得後面不需要每次指定名字空間,相當於java中的import功能。不過,多次使用“using namespace”時,被指定的名字空間同時有效,很容易衝突。
#include <iostream>
using namespace std;
namespace na
{
void print(int a) {
cout << "na::print: " << a << endl; }
}
namespace nb
{
using namespace na;
void print2(int a, int b) { //這是nb自身的函式
print(a); //na的函式
print(b); //na的函式}
void print(int n) { //這也是nb自身的函式
cout << "nb::print: " << n << endl; }
}
namespace nc
{
using nb::print2; //指定只使用nb的print2()函式
void print(int a, int b, int c) {
print2(a, b); //這是nb的函式
nb::print(c); //using中沒有指定,所以這兒必須用nb::來指定}
}
int main ( ) {
using namespace na;
print(2);//na的print()函式
//using namespace nb;
//這樣使用時,na和nb同時有效
//print(3);
//編譯系統不清楚究竟調用na和nb中的哪一個,因為函式名和參數相同using namespace nc;
//這樣使用時,na和nc同時有效
print(4, 5, 6); //nc的print()函式的參數與na中的參數不同,所以這兒不出錯。
using nb::print; //指定下面用的print()函式是nb的函式
print(7);
return 0;}
三、用別名指定名字空間
名字空間可以一層層嵌套,指定時也得一層層地指定,這樣很不方便,一般用別名代替就方便多了。
#include <iostream>
using namespace std;
namespace na
{
namespace nb
{ namespace nc
{
int sum(int a, int b) { return a + b; }
}
}
}
namespace A = na::nb::nc;
int main ( )
{
cout << na::nb::nc::sum(5, 11) << endl;
cout << A::sum(6, 12) << endl; return 0;
}
四、沒有名字的名字空間
名字空間的名字也可以省略,稱之為“無名名字空間”,無名名字空間經常被使用,其作用是“內部可以引用,而外部不能引用”。
#include <iostream>
using namespace std;
namespace na {
namespace
{ //無名名字空間
int sum(int a, int b) { return a + b; }
}
int calc(int x, int y)
{ return sum(x, y); //內部可以調用無名名字空間的變數或函式
}
}
int main ( ) {
//cout << na::sum(5, 11) << endl; //因為缺少裡面的名字,所以外部不能調用
cout << na::calc(6, 12) << endl;
return 0;}