C++ の名前空間
同じクラスに同じ名前のザラが 2 人いる場合を考えてみましょう。それらを明確に区別する必要があるときはいつでも、地域、別の地域に住んでいる場合、母親または父親の名前など、名前とともにいくつかの追加情報を使用する必要があります.
C++ アプリケーションでも同じ状況が発生する可能性があります。たとえば、xyz() という関数を持つコードを書いていて、同じ関数 xyz() を持つ別のライブラリが利用可能であるとします。現在、コンパイラは、コード内で参照している xyz() 関数のバージョンを知る方法がありません。
名前空間 この問題を克服するように設計されており、異なるライブラリで利用可能な同じ名前を持つ類似の関数、クラス、変数などを区別するための追加情報として使用されます。名前空間を使用すると、名前が定義されるコンテキストを定義できます。本質的に、名前空間はスコープを定義します。
名前空間の定義
名前空間の定義はキーワード namespace で始まります 次のように名前空間名が続きます-
namespace namespace_name { // code declarations }
関数または変数の名前空間対応バージョンを呼び出すには、次のように名前空間名を先頭に (::) 追加します −
name::code; // code could be variable or function.
名前空間が変数や関数を含むエンティティをどのようにスコープするかを見てみましょう −
ライブデモ#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } } // second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } int main () { // Calls function from first name space. first_space::func(); // Calls function from second name space. second_space::func(); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Inside first_space Inside second_space
using ディレクティブ
using namespace を使用して、名前空間の先頭に追加することを避けることもできます。 指令。このディレクティブは、後続のコードが指定された名前空間の名前を使用していることをコンパイラに伝えます。したがって、名前空間は次のコードで暗示されます −
ライブデモ#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } } // second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } using namespace first_space; int main () { // This calls function from first name space. func(); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Inside first_space
「using」ディレクティブは、名前空間内の特定のアイテムを参照するためにも使用できます。たとえば、使用する std 名前空間の唯一の部分が cout である場合、次のように参照できます −
using std::cout;
後続のコードは名前空間を前に付けずに cout を参照できますが、 std 内の他の項目は 名前空間は、次のように明示する必要があります −
ライブデモ#include <iostream> using std::cout; int main () { cout << "std::endl is used with std!" << std::endl; return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
std::endl is used with std!
using で導入された名前 ディレクティブは通常のスコープ規則に従います。 使用した時点から名前が表示されます ディレクティブが見つかったスコープの最後にディレクティブを追加します。外側のスコープで定義された同じ名前のエンティティは非表示になります。
不連続な名前空間
名前空間は複数の部分で定義できるため、名前空間は個別に定義された部分の合計で構成されます。名前空間の個別の部分は、複数のファイルに分散できます。
そのため、名前空間の一部で別のファイルで定義された名前が必要な場合でも、その名前を宣言する必要があります。次の名前空間定義を書くと、新しい名前空間を定義するか、既存の名前空間に新しい要素を追加します-
namespace namespace_name { // code declarations }
ネストされた名前空間
名前空間は、次のように別の名前空間内にある名前空間を定義できる場所にネストできます-
namespace namespace_name1 { // code declarations namespace namespace_name2 { // code declarations } }
次のように解決演算子を使用して、ネストされた名前空間のメンバーにアクセスできます −
// to access members of namespace_name2 using namespace namespace_name1::namespace_name2; // to access members of namespace:name1 using namespace namespace_name1;
上記のステートメントでは、namespace_name1 を使用している場合、次のように namespace_name2 の要素をスコープで使用できるようにします-
ライブデモ#include <iostream> using namespace std; // first name space namespace first_space { void func() { cout << "Inside first_space" << endl; } // second name space namespace second_space { void func() { cout << "Inside second_space" << endl; } } } using namespace first_space::second_space; int main () { // This calls function from second name space. func(); return 0; }
上記のコードをコンパイルして実行すると、次の結果が生成されます −
Inside second_space
C言語