第17章 用于大型程序的工具(8)

2014-11-24 12:24:42 · 作者: · 浏览: 5

6. 定义命名空间成员

在命名空间内部定义的函数可以使用同一命名空间中定义的名字的简写形式。

//Class2.cpp
#include "stdafx.h"
#include "NameSpace2.h"

namespace Andersoft
{
namespace Namespace2
{
class Class2{
private:
Class1 *c1; //Class1 can be referenced directly.
};
}
}
//Class2.cpp
#include "stdafx.h"
#include "NameSpace2.h"

namespace Andersoft
{
namespace Namespace2
{
class Class2{
private:
Class1 *c1; //Class1 can be referenced directly.
};
}
}也可以在命名空间定义的外部定义命名空间成员,用类似于在类外部定义类成员的方式:名字的命名空间声明必须在作用域中,并且定义必须指定该名字所属的命名空间。

//Class2.cpp
#include "stdafx.h"
#include "NameSpace2.h"

class Andersoft::Namespace2::Class2{
private:
Class1 *c1;
};
//Class2.cpp
#include "stdafx.h"
#include "NameSpace2.h"

class Andersoft::Namespace2::Class2{
private:
Class1 *c1;
};
7. 不能在不相关的命名空间中定义成员

虽然可以在命名空间定义的外部定义命名空间成员,对这个定义可以出现的地方仍有些限制,只有包围成员声明的命名空间可以包含成员的定义。

8. 全局命名空间

定义在全局作用域的名字(在任意类、函数或命名空间外部声明的名字)是定义在全局命名空间(global namespace)中的。全局命名空间是隐式声明的,存在于每个程序中。在全局作用域定义实体的每个文件将那些名字加到全局命名空间。

可以用作用域操作符引用全局命名空间的成员。因为全局命名空间是隐含的,它没有名字,所以记号::member_name引用全局命名空间的成员。

::Handle h(new int(10));
::Handle h(new int(10));17.2.2嵌套命名空间

一个嵌套命名空间即是一个嵌套作用域——其作用域嵌套在包含它的命名空间内部。嵌套命名空间内部定义的名字局部于该命名空间。外围命名空间之外的代码只能通过限定名引用嵌套命名空间中的名字。

嵌套命名空间可以改进库中代码的组织。

//Namespace2.h
#ifndef NAMESPACE2_H
#define NAMESPACE2_H
namespace Andersoft
{
namespace Namespace2
{
class Class1;
class Class2;
}
}
#endif
//Namespace2.h
#ifndef NAMESPACE2_H
#define NAMESPACE2_H
namespace Andersoft
{
namespace Namespace2
{
class Class1;
class Class2;
}
}
#endifusing namespace std;
using namespace Anders::NameSpace2;

int _tmain(int argc, _TCHAR* argv[])
{
Anders::NameSpace2::Class1 c1();
return 0;
}

摘自 xufei96的专栏