C++学習ノート-ネーミングスペース

5399 ワード

ネーミングスペース
ネーミングスペースまたはネーミングスペース(名前はnamespace)は、大規模なプロジェクトで識別子の競合を防止するために導入され、実際にはユーザーがネーミングできる役割ドメインです.
touzaniのコラムのこのC++ネーミングスペースnamespaceは、よく書けていると思います(良し悪しは言えませんが、私も勉強の態度で技術ブログを読んでいるので)、この部分はこのブログをたくさん参考にしました.
ネーミングスペースに関する概念:
  • 宣言ドメイン(declaration region)--識別子を宣言する領域.関数の外で宣言されたグローバル変数のように、その宣言ドメインは宣言されたファイルです.関数内で宣言されるローカル変数.その宣言ドメインは、宣言されたコードブロック(関数全体または複合文全体など)です.
  • 潜在的役割ドメイン(potential scope)--宣言ポイントから、宣言ドメインの末尾までの領域.C++は先に宣言してから使用する原則を採用しているので、宣言ポイントより前の宣言ドメインでは識別子は使用できません.すなわち、識別子の潜在的な役割ドメインは、通常、その宣言ドメインよりも小さい.
  • 役割ドメイン(scope)--識別子がプログラムに表示される範囲.識別子は、その潜在的な役割ドメイン内で、どこでも表示されるわけではありません.例えば、局所変数は、グローバル変数を遮蔽することができ、ネストされた階層内の内層変数は、外層変数を遮蔽することができ、遮蔽されたグローバル変数または外層変数は、その倍遮蔽された領域内では見えない.したがって、識別子の役割ドメインは、潜在的な役割ドメインよりも小さい場合があります.C言語中国語網の解釈はもっとはっきりしている.「変数がプログラムで使用できる有効範囲を変数の役割ドメインと呼ぶ.」

  • 元のC++識別子の役割ドメイン:グローバル役割ドメイン、ブロック役割ドメイン、クラス役割ドメイン.範囲の大きさで順番を決めるなら、私の理解はこうです.
    ブロック役割ドメイン<クラス役割ドメイン<グローバル役割ドメインであり、ネーミングスペースはクラス役割ドメインとグローバル役割ドメインの間にある.
    ネーミングスペースは、グローバルであってもよいし、別のネーミングスペースであってもよいが、クラスおよびコードブロックには存在しない.したがって、ネーミングスペースで宣言された名前(識別子)は、デフォルトでは外部リンクプロパティ(定数を参照しない限り)、つまりグローバルな役割ドメインを有しますが、グローバルに表示されるわけではありません.
    すべてのネーミングスペースに加えて、ファイルレベルの宣言ドメインに対応するグローバルネーミングスペースも存在します.従って,ネーミング空間メカニズムでは,従来のグローバル変数が,現在ではグローバルネーミング空間に位置すると考えられる.
    名前空間の定義:
    有名なネーミングスペース:
    namespace       {
             
    }

    無名のネーミングスペース:
    namespace {
              
    }

    ネーミングスペースの定義内で、ネーミングスペースのメンバー(内部定義)を定義できます.また、ネーミングスペースの定義内でのみメンバーを宣言し、ネーミングスペースの定義の外でネーミングスペースのメンバー(外部定義)を定義することもできます.
    例:
    namespace Outer //     Outer   
    { 
        int i; //     Outer   i     
        namespace Inner //      Inner     
        { 
            void f() //     Inner   f()     ,   i Outer::i
            { 
                i++; 
            } 
            int i;
            void g() //     Inner   g()     ,   i Inner::i
            { 
                i++; 
            } 
            void h(); //     Inner   h()   
        }
    
        void f(); //     Outer   f()   
        // namespace Inner2; //   ,         
    }
    
    void Outer::f() //     Outer   f()     
    { 
        i--;
    } 
    void Outer::Inner::h() //     Inner   h()     
    { 
        i--;
    } 
    // namespace Outer::Inner2 //   ,            
    // { 
    //      /*……*/
    // } 

    注意:
    サブネーミングスペースは、ネーミングスペースの定義で宣言することはできません(別のネストされた)が、ネーミングスペースの定義でのみ定義できます.
    また、「名前空間名::メンバー名......」の定義を直接使用して、名前空間に新しいメンバーを追加することはできません.名前空間の定義に新しいメンバーの宣言を追加する必要があります.
    また、ネーミングスペースはオープンであり、新しいメンバー名を既存のネーミングスペースにいつでも追加することができます.方法は、同じネーミングスペースを複数回宣言して定義し、毎回自分の新しいメンバーと名前を追加することです.例:
    namespace A
    {
       int i;
       void f();
    } //   A   i f()
    
    namespace A 
    {
        int j;
        void g();
    } //   A    i、f()、j g()

    ネームスペースの使用:
  • 使用用ドメイン限定子:::;
  • using宣言メカニズムの使用:using ::
  • usingコンパイル命令:using namespace ;
  • USing宣言文またはコンパイル命令がエンティティの可視ドメインをどの程度拡張するかについては、using文の書き込み位置、すなわち、using文の可視ドメインに依存します.
    #include 
    #include 
    using std::string; // using       ,string    (          )
    
    void Display(const string text)
    {
    //    using namespace std; //    ,std                
        using std::cout;  // using       ,string         
        using std::endl;
        cout << text<< endl;
    }
    
    int main()
    {
        string str = "code the world!";
        Display(str);
    //    cout << str << endl; //       ,    std::cout、std::endl   
        return 0;
    }