C++ 名前空間
目次
クラスに Zara という名前の生徒が 2 人いる場合、それらを明確に区別するために、名前以外の追加情報 (自宅の住所や両親の名前など) を使用する必要があるとします。
C++ アプリケーションでも同じ状況が発生します。たとえば、xyz() という関数を作成し、同じ関数 xyz() が別の使用可能なライブラリに存在するとします。このように、コンパイラは、使用している xyz() 関数を判別できません。
したがって、上記の問題を解決するために特別に使用される名前空間の概念が導入され、異なるライブラリで同じ名前を持つ関数、クラス、変数などを区別するための追加情報として使用できます。名前空間を使用すると、コンテキストが定義されます。基本的に、名前空間はスコープを定義します。
コンピューター システムを例にとると、フォルダー (ディレクトリ) には複数のフォルダーを含めることができます. 各フォルダーに同じファイル名を付けることはできませんが、異なるフォルダー内のファイルに同じ名前を付けることはできます.
名前空間を定義する
名前空間は、次のように、キーワード namespaceの後に名前空間の名前を付けて定義します。
namespace namespace_name {
// 代码声明
}
名前空間で関数または変数を呼び出すには、次のように名前空間の名前を前に付ける必要があります。
name::code; // code 可以是变量或函数
名前空間が変数や関数などのエンティティのスコープを定義する方法を見てみましょう。
例
#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
int main ()
{
// 调用第一个命名空间中的函数
first_space::func();
// 调用第二个命名空间中的函数
second_space::func();
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
Inside first_space
Inside second_space
ディレクティブの使用
名前空間の名前を前に付けずに名前空間を使用できるように、using namespaceディレクティブを使用できます 。このディレクティブは、後続のコードが指定された名前空間の名前を使用することをコンパイラに伝えます。
例
#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
using namespace first_space;
int main ()
{
// 调用第一个命名空间中的函数
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 ディレクティブによって導入された名前は、通常のスコープ規則に従います。名前は、 usingディレクティブ の先頭からスコープの終わりまで表示されます。この時点で、スコープ外で定義された同じ名前のエンティティは非表示になります。
切り離された名前空間
名前空間はいくつかの異なるセクションで定義できるため、名前空間は別々に定義されたいくつかのセクションで構成されます。名前空間のさまざまなコンポーネントは、複数のファイルに分散できます。
そのため、名前空間のコンポーネントが別のファイルで定義された名前を要求する必要がある場合でも、その名前を宣言する必要があります。次の名前空間定義では、新しい名前空間を定義したり、既存の名前空間に新しい要素を追加したりできます。
namespace namespace_name {
// 代码声明
}
ネストされた名前空間
名前空間は入れ子にすることができ、次のように別の名前空間内に名前空間を定義できます。
namespace namespace_name1 {
// 代码声明
namespace namespace_name2 {
// 代码声明
}
}
:: 演算子を使用して、ネストされた名前空間のメンバーにアクセスできます。
// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;
// 访问 namespace:name1 中的成员
using namespace namespace_name1;
上記のステートメントで、namespace_name1 が使用されている場合、次のように、namespace_name2 の要素もこのスコープで使用できます。
例
#include <iostream>
using namespace std;
// 第一个命名空间
namespace first_space{
void func(){
cout << "Inside first_space" << endl;
}
// 第二个命名空间
namespace second_space{
void func(){
cout << "Inside second_space" << endl;
}
}
}
using namespace first_space::second_space;
int main ()
{
// 调用第二个命名空间中的函数
func();
return 0;
}
上記のコードをコンパイルして実行すると、次の結果が生成されます。
Inside second_space