名前の追加


名前空間を可視化する

前回、名前空間にメンバを割り当てる方法を説明しました
これで、変数などの識別子がグローバルな位置で衝突することを避けられます

しかし、ある名前空間のメンバを数百回も使う場合
わざわざ何度も、スコープ演算子で名前空間を指定するのは面倒です
それは、むしろ余計なバグを生む可能性すらありますね

そこで using キーワードを用います
私たちがこれまで、cout などの標準集出力を指定するのに
ファイルの先頭で指定していたのも、この using によるものでした

using name::member;

name には名前空間を、memberにはその空間のメンバを指定します
この構文を用いることで、その名前空間の指定したシンボルを可視化できます
#include<iostream>

int main() {
	using std::cout;
	cout << "Kitty on your lap";
	return 0;
}
いつもとは少し違う構文ですね
この構文では、標準ライブラリの名前空間 std のうち cout だけを可視化しています
そのため、stdライブラリの他のシンボルへのアクセスは直接できません

using の適応範囲も変数同様にスコープによって異なります
ある関数内で使われた場合は、その関数でのみ名前を可視化できます
#include<iostream>

void Kitty() {
	using std::cout;
	cout << "Kitty on your lap\n";
}

int main() {
	Kitty();
	std::cout << "Card Captor SAKURA\n";
	return 0;
}
関数 Kitty() は、using によって名前空間 std のメンバ cout を可視化しています
しかしこの適応範囲は Kitty () 関数のみで、他の関数では不可視です
そのため、main() 関数からは直接アクセスすることはできません


using ディレクティブ

先ほどの using による名前空間の可視化は
指定した名前空間の特定のシンボルの可視化でした

ここで紹介する using ディレクティブの場合は
特定の名前空間そのものをグローバル領域に追加するものです
私たちがこれまで、std 標準ライブラリの入出力を使用するのに用いた手段です

using namespace name;

name には、追加する名前空間を指定します
これを用いれば、特定の名前空間のシンボルをすべて可視化することができます
#include<iostream>
using namespace std;

namespace Kitten {
	void Kitty() {
		cout << "Kitty on your lap\n";
	}
}

int main() {
	using namespace Kitten;
	Kitty();
	cout << "Chobits\n";

	return 0;
}
このプログラムは、名前空間の可視化を2ヶ所で行っています
重要なのは、using による名前空間の可視化は追加であるということです
main() 関数の Kitten 名前空間の可視化で std 名前空間が不可視になることはありません
using による指定は、常に現在のグローバルな名前空間への追加なのです


using

using name::member;
using namespace name;

宣言領域に名前を追加します
指定した名前空間、またはそのメンバを可視化できます

name - 名前空間を指定します
member - 名前空間の可視化するシンボルを指定します



前のページへ戻る次のページへ