名前の追加
名前空間を可視化する
前回、名前空間にメンバを割り当てる方法を説明しました
これで、変数などの識別子がグローバルな位置で衝突することを避けられます
しかし、ある名前空間のメンバを数百回も使う場合
わざわざ何度も、スコープ演算子で名前空間を指定するのは面倒です
それは、むしろ余計なバグを生む可能性すらありますね
そこで 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 - 名前空間の可視化するシンボルを指定します