名前空間とは
C++には名前空間(namespace)という概念が存在します。
ソースコードを書くにあたり、これを意識してコーディングする必要があります。
変数や関数にはスコープがあります。
スコープとはその変数、関数が存在できる範囲のことです。
詳しくは変数にて解説しています。
スコープの外からではその変数は呼び出すことができません。
つまり、スコープが重なっていなければ同じ名前の変数を複数定義することができます。
例えば、同一関数のなかでfor文ごとにカウンタ変数iを別々に定義することがあります。
名前空間とはこのようなスコープを提供する機能です。
汎用的な名前を使いまわせるようにクラスとそのメソッドを名前空間の中に指定します。
よく使われるのは名前空間stdです。
<iostream>はstdの中に定義されているので、<iostream>内の命令coutを使うには
std::cout
と名前空間を宣言する必要があります。
あまり自身で使うことは多くありませんが、以下のように名前空間を定義することができます。
namespace 【名前空間名】 { 【処理】 }
名前空間は入れ子にすることができます。
ns1::ns2::val
このように記述すると、これは名前空間ns1の中にある名前空間ns2内の変数valを意味します。
名前空間の省略
関数を呼び出すごとに名前空間を指定するのは面倒ですね。
これを省略する機能があります。
using namespace 【名前空間】
これを使うことで、ソースコード内で名前空間の宣言を省略できます。
using namespace std;
とすれば、ソースコード内の「std::cout」を「cout」と省略できます。
便利な機能ですが、注意すべき点があります。
名前空間は名前の衝突を防ぐためのものであることを前節で説明しましたね。
using namespaceを使った場合、名前空間内の変数(関数)と自身で定義した変数(関数)を区別できなくなります。
その為using namespace stdを記述した場合、std内にある全ての名前を新たに定義できなくなります。
特にstdは基本的な機能が揃っている為、ユーザーがよく使う名前を持っています。
名前空間を個別に省略
これでは困ることもありますね。
using文では、これを解決するために使いたい命令単位で指定することができます。
例えば、coutのみstd::を省略するには以下のように記述します。
using std::cout;
これで、名前の衝突を防ぎつつ煩雑な表記を省略できます。