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<int> h(new int(10));
::Handle<int> 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的專欄