c++ネーミングスペース

4306 ワード

http://www.cnblogs.com/zhuyf87/archive/2012/12/15/2819569.html
ネーミングスペース(namespace)は、名前の競合を防止するために制御可能なメカニズムを提供します.ネーミングスペースは、他のネーミングスペースと同じ名前で競合することなく、ネーミングスペース内で独自のテンプレート名、タイプ名、関数名を定義する役割ドメインです.
namespace cplusplus_primer {
class SalesItem { /* … */ };
SalesItem operator+(const SalesItem &, const SalesItem&);
class Query {
public:
    Query(const std::string&);
    std::ostream & display(std::ostream&) const;
    // …
};
class QueryBase { /* … */ };
}


ネーミングスペースの名前は、ネーミングスペースの役割ドメインで一意である必要があります.ネーミングスペースは、グローバル役割ドメインまたは他の役割ドメインの内部で定義できますが、関数またはクラスの内部で定義できません.ネーミングスペースの役割ドメインはセミコロンで終了しません.
1.各ネーミングスペースは1つの役割ドメインである
ネーミングスペースで定義された名前は、ネーミングスペース内の他のメンバーによって直接アクセスできます.ネーミングスペース以外のコードは、名前定義がどのネーミングスペースにあるかを指定する必要があります.
cplusplus_primer::Query q = cplusplus_primer::Query(“hello”);
q.display(cout);
// …

2.using宣言
よく使用する名前への直接アクセスを得るためにusing宣言を作成できます.
using cplusplus_primer::Query;

このusing宣言の後、プログラムは名前Queryを直接使用することができます.
3.ネーミングスペースは連続していなくてもよい
1つのネーミングスペースは、複数のファイルに分散して定義できます.ただし、ネーミングスペースの一部で別のファイルに定義された名前を使用する必要がある場合は、名前を宣言する必要があります.
namespace namespace_name {
// declarations
}

namespace_nameは、前に定義したネーミングスペースを参照するのではなく、その名前で新しいネーミングスペースを作成します.そうしないと、この定義は既存のネーミングスペースを開き、新しい宣言をそのネーミングスペースに追加します.
4.インタフェースと実装の分離
分離されたインタフェースファイルと実装ファイルでネーミングスペースを構成できます.ネーミングスペースは、管理クラスと関数定義と同じ方法で整理できます.複数の非相関タイプを定義するネーミングスペースは、分離されたファイルを使用して各タイプをそれぞれ定義する必要があります.
// sales_item.h
namespace cplusplus_primer {
class SalesItem { /* … */ };
SalesItem operator+(const SalesItem&, const SalesItem&);
}
// query.h
namespace cplusplus_primer {
class Query {
public:
    Query(const std::string&);
    std::ostream & display(std::ostream&) const;
};
}
// sales_item.cpp
#include “sales_item.h”
namespace cplusplus_primer {
// definitions for SalesItem members and overloaded operators
}
// query.cpp
#include “query.h”
namespace cplusplus_primer {
// definitions for Query members and related functions
}


5.名前空間メンバーの定義
クラスの外部でクラスメンバーを定義する方法と同様に、ネーミングスペース定義の外部でネーミングスペースメンバーを定義できます.
// namespace members defined outside the namespace must use qualified names
cplusplus_primer::operator+(const SalesItem&, const SalesItem&)
{
SalesItem ret(lhs);
//
}


完全に定義された関数名が表示されると、この関数はネーミングスペースの役割ドメインに存在します.したがって、パラメータテーブルと関数ボディのネーミングスペースメンバー参照には、非限定名を使用できます.
6.グローバルネーミングスペース
グローバル役割ドメインに定義される名前(任意のクラス、関数、ネーミングスペースの外部で宣言される名前)は、グローバルネーミングスペース(global namespace)に定義されます.グローバルネーミングスペースは暗黙的に宣言され、各プログラムに存在します.グローバル役割ドメイン定義エンティティの各ファイルは、それらの名前をグローバルネーミングスペースに追加します.
グローバルネーミングスペースは隠されていて、名前がなくて、::member_nameは、グローバルネーミングスペースのメンバーを参照します.