C ++の名前空間

 1.名前空間を使用する理由

同じクラスに同じ名前のZaraという2人がいる場合を考えてみましょう。それらを区別する必要がある場合、別の地域に住んでいるか、母親や父親の名前などの場合は、この地域などの追加情報と名前を使用する必要があります。

  C ++アプリケーションでも同じことが起こります。たとえば、xyz()という関数を使用してコードを記述している場合、同じxyz()関数を持つ別のライブラリが利用可能です。これで、コンパイラーはコードで参照しているxyz()関数のバージョンを知ることができません。

  名前空間は、この困難を克服するように設計されており、異なるライブラリで同じ名前を持つ類似の関数、クラス、変数などを区別するための追加情報として使用されます。名前空間を使用して、名前が定義されているコンテキストを定義できます。基本的に、名前空間はスコープを定義します。

第二に、名前空間の定義

C言語のグローバルスコープは1つだけです。

1. C言語のすべてのグローバル識別子はスコープを共有します
2.識別子間で起こりうる競合
C ++は名前空間の概念を提案しました:

1.名前空間はグローバルスコープをさまざまな部分に分割します
。2。異なる名前空間の識別子は競合せずに同じ名前を持つことが
できます3.名前空間はネストできます
4.グローバルスコープはデフォルトの名前空間とも呼ばれます

名前空間の定義

名前空間の定義は、次のように、キーワードの名前空間で始まり、その後に名前空間名が続きます-

namespace namespace_name {
    // コード宣言 
}

名前空間を有効にしたバージョンの関数または変数を呼び出すには、次のように名前空間名の前に(::)を追加します-

関数または変数の名前空間対応バージョンを呼び出すには、次のように名前空間名の前に(::)を追加します。

name :: code;  // コードは変数または関数にすることができます。

名前空間が変数と関数を含むエンティティをどのようにスコープするか見てみましょう-

名前空間が変数や関数を含むエンティティをどのように制限するか見てみましょう-

#include <iostream>
 using  namespace std; 

// 最初の名前空間の
名前空間first_space {
    void func(){ 
      cout << " Inside first_space " << endl; 
   } 
} 

// 2番目の名前空間の
名前空間second_space {
    void func(){ 
      cout << " Inside second_space " << endl; 
   } 
} 

int main(){
    // 最初の名前空間から関数を呼び出します。
   first_space :: func(); 
   
   // 2番目の名前空間から関数を呼び出します。
   second_space :: func(); 

   0を返し ます
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

first_spaceの内部second_spaceの
内部

名前空間ディレクティブの使用を回避することもできます。名前空間の前に接頭辞を追加します。このディレクティブは、後続のコードが指定された名前空間の名前を使用していることをコンパイラーに通知します。したがって、次のコードは名前空間を意味します

#include <iostream>
 using  namespace std; 

// 最初の名前空間の
名前空間first_space {
    void func(){ 
      cout << " Inside first_space " << endl; 
   } 
} 

// 2番目の名前空間の
名前空間second_space {
    void func(){ 
      cout << " Inside second_space " << endl; 
   } 
} 

使用して 名前空間first_spaceと、
int main(){
    //これは最初の名前空間から関数を呼び出します。
   func(); 
   
   0を返し ます
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

first_space内

「using」ディレクティブを使用して、名前空間内の特定のアイテムを参照することもできます。たとえば、使用するstd名前空間の唯一の部分がcoutである場合、次のように参照できます-

後続のコードは名前空間を先頭に追加せずにcoutを参照できますが、stdnamespace内の他の項目は次のように明示的にする必要があります-

#include <iostream>
 を使用してstd :: cout; 

int main(){ 
   cout << " std :: endl is used with std!" << std :: endl; 
   
   0を返し ます
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

std :: endl  std 使用されます!

usingディレクティブで導入された名前は、通常のスコープルールに従います。名前は、ディレクティブを使用した時点から、ディレクティブが見つかったスコープの最後まで表示されます。外部スコープ内の同じ名前のエンティティは非表示になります。

まとめ

C ++名前空間の使用:

名前空間全体を使用します。名前空間名を使用します。
名前空間で変数を使用する:名前::変数を使用する
デフォルトの名前空間の変数を使用する:::変数

不連続な名前空間

名前空間はいくつかの部分に分割して定義できるため、名前空間は個別に定義された部分の合計で構成されます。名前空間のさまざまな部分は、複数のファイルで配布できます。したがって、名前空間の一部に別のファイルで定義された名前が必要な場合でも、名前を宣言する必要があります。次の名前空間定義を記述するか、新しい名前空間を定義するか、既存の名前空間に新しい要素を追加します-

namespace namespace_name {
    // コード宣言 
}

ネストされた名前空間は名前空間をネストできます

次のように、別のネームスペースにネームスペースを定義できます。

namespace namespace_name1 {
    // コード宣言
   namespace namespace_name2 {
       // コード宣言
   } 
}

次のように、解決演算子を使用して、ネストされた名前空間のメンバーにアクセスできます。

// 名前空間namespace_name1 :: namespace_name2 を使用して、namespace_name2のメンバーにアクセスし
ます。// 名前空間namespace_name1 を使用して、namespace:name1のメンバーにアクセスします。 


 

上記のステートメントで、namespace_name1が使用されている場合、次のように、scope_name2の要素がスコープで使用可能になります。

#include <iostream>
 using  namespace std; 

// 最初の名前空間の
名前空間first_space {
    void func(){ 
      cout << " Inside first_space " << endl; 
   } 
   
   // 2番目の名前空間の
   ネームスペースsecond_space {
       void func(){ 
         cout << " Inside second_space " << endl; 
      } 
   } 
} 

使用して 名前空間first_space :: second_space。
int main(){
    //これは、2番目の名前空間から関数を呼び出します。
   func(); 
   
   0を返し ます
}

上記のコードをコンパイルして実行すると、次の結果が生成されます-

second_space内

https://www.tutorialspoint.com/cplusplus/cpp_namespaces.htmからの参照

おすすめ

転載: www.cnblogs.com/xxxsans/p/12717021.html