namespace
namespace是名字空间,可以防止多个文件有重复定义成员(变量,函数,类等)
命名空间成员的外部定义的格式为: 命名空间名::成员名 ……
有名字的命名空间
嵌套namespace
namespace Outer
{
int i;
namespace Inner
{
void f() { i++; }
int i;
void g() { i++; }
void h();
}
void f();
}
void Outer::f() { i--; }
void Outer::Inner::h() { i--; }
int main()
{
Outer::i = 0;
Outer::f();
Outer::Inner::f();
Outer::Inner::i = 0;
Outer::Inner::g();
Outer::Inner::h();
std::cout << "Hello, World!" << std::endl;
std::cout << "Outer::i = " << Outer::i << ", Inner::i = " << Outer::Inner::i << std::endl;
}
名字空间的别名
namespace别名 = 原空间名;
使用using指令引入已有命名空间
namespace A
{
int i;
void func1() {}
void func2() {}
}
namespace B
{
int j;
void func3() {}
void func4() {}
}
namespace C
{
using namespace A;
using namespace B;
void func5(int m, int n) {}
}
using namespace C;
int main()
{
func1();
func3();
func5(i, j);
return 0;
}
名字空间和重载
namespace A
{
void f(char c) { cout << "char is " << c << endl; }
}
namespace B
{
void f(int i) { cout << "int is " << i << endl; }
}
int main()
{
using A::f;
using B::f;
f('a');
f(10);
return 0;
}
名字空间是开放的
随时把新的成员名称加入到已有的命名空间之中去。方法是,多次声明和定义同一命名空间,每次添加自己的新成员和名称。
namespace A
{
int i;
void func1();
}
namespace A
{
int j;
void func2();
}
函数名查找
一个取T类型参数的函数常常与T类型本身定义在同一个名字空间里。因此,如果在使用一个函数的环境中无法找到它,我们就去查看它的参数所在的名字空间。
namespace A
{
class Date {};
void func1(const Date&)
{
}
}
namespace B
{
class Time {};
void f(A::Date d, int i)
{
func1(d);
}
void func2(Time t) {}
}
int main()
{
B::Time t1;
func2(t1);
return 0;
}
无名的命名空间
在C++中 我们可以用未命名的名字空间(unnamed namespace)声明一个局部于某一文件的实体,未命名的名字空间以关键字namespace开头,同时该名字空间是没有名字的,所以在关键字 namespace后面没有名字,而在关键字 namespace后面使用花括号包含声明块。在一些情况下,名字空间的作用仅仅是为了保持代码的局部性。
- 同一个文件中可以有多个未命名的名字空间,若它们位于同一作用域,则名字空间中不能有相同的成员
- 同一个文件中的多个未命名的名字空间,若它们位于不同的作用域,在它们名字空间中可以有相同的成员
注意点:
- 无名名字空间主要是保持代码的局部性
- 在C++编译器实现时,无名名字空间其实是有名字的,这个隐含的名字跟它所在编译单元名字相关。所以基于这一点,我们不能跨编译单元使用无名名字空间中的名字
C++ 标准库
C++标准程序库中的所有标识符都被定义于一个名为std的namespace中。由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:
- 直接指定标识符。例如std::ostream而不是ostream。完整语句如下:
#include <iostream>
std::cout << "hello!!"<< std::endl;
#include <iostream>
using std::cout;
using std::endl;
- 最方便的就是使用指令using namespace std;
#include <iostream>
using namespace std;
|