C++の名前空間(namespace)についての記事です。ちなみにC言語に名前空間はありません。 よく見る「using namespace std」の注意点なども解説します。
名前空間とは、ある領域に名前をつけて宣言することをいいます。 名前空間をつけることで、その中にある関数や変数などが他と重複しないようにすることができます。
#include <iostream>
// 名前空間の宣言
namespace TEST1
{
void test(){
std::cout << "test1" << std::endl;
}
}
// 名前空間の宣言
namespace TEST2
{
void test(){
std::cout << "test2" << std::endl;
}
}
int main()
{
// 名前空間を使う
TEST1::test();
TEST2::test();
}
上記のように、test関数が2つあった場合は名前空間を使うことで、どちらのtest関数を使うか明示的にすることができます。
開発規模が大きくなればなるほど、名前が重複する可能性があがるため、どの変数や関数を使うのかを明示することは大事なことなのです。
using directiveとは指定した名前空間を使うことをいいます。 以下のように記載します。
using namespace 名前空間;
よくあるものとして、stdという名前空間を使う場合は以下のように記述します。
using namespace std;
これを記述することで、std内にある変数や関数、クラスを利用することができます。
例として、よく使う出力関数のcoutで説明します。coutは名前空間がstdというものに組み込まれており、 使用する場合は名前空間を指定して以下のように書く必要があります。
#include <iostream>
int main()
{
std::cout << "test1" << std::endl;
}
しかし、あらかじめ「using namespace std;」記述しておけば、以下のように省略することが可能です。
#include <iostream>
using namespace std;
int main()
{
cout << "test1" << endl;
}
このように、使用したい名前空間をあらかじめ宣言することをusing directiveといいますが、 この仕組みには注意点があります。
using directiveは指定した名前空間内の変数や関数、クラスを全て利用可能な状態にするため、 大変便利そうですが、デメリットとして 名前の重複があります。
例えば、先ほど例としてあげたstdはC++の標準ライブラリであり多数の関数などが定義されています。 全ての関数名を把握している人はほとんどいないでしょう。
そこで、using directiveで宣言してstd内の全ての関数を使えるようにしたらどうでしょう。 自作した関数名とstd内の関数名が重複することも十分に考えらます。
対策としては名前空間ごと指定するのではなく、名前空間内にある関数名などをピンポイントで指定することです。 これをusing declarations(宣言)といいます。
using declarationsとは指定した名前空間内のメンバを使うことをいいます。 名前空間内の全てのメンバを利用できるusing directiveとちがい、 利用可能になるのは指定したメンバのみです。
using 名前空間 メンバ名
例えば、名前空間がstdであり、その中にあるcout関数を使う場合は以下のように書きます。
using std::cout
以下がサンプルです。
#include <iostream>
int main()
{
using std::cout;
using std::endl;
cout << "test1" << endl;
}
このように、ある名前空間の使いたいメンバだけを指定することをusing declarationsといいます。 using directiveと異なり名前重複のリスクが減るので、こちらを使用することを推奨します。
カテゴリーの一覧です。
当サイト(KONOTI)は、日常生活において運営者が得た情報をご紹介するサイトです。 ジャンルに多少の偏りはありますが、基本的には様々な情報を取り扱っていく予定です。