プログラム・プロブレム

第三回 名前空間(C++)


I はじめに

涼(以下S):お久しぶりです。涼(すず)です。
初(以下H):初(はじめ)だ。今回は名前空間について話すぞ。

II ソースコード

S:今回は解説が短いですよ。サンプルソースも短いですからね。
01:// namespace.cpp
02:#include <iostream>
03:using namespace std;
04:int main(int argc,char* argv[])
05:{
06:  cout << "This is namespace program." << endl;
07:  return 0;
08:}
H:ぱっと見、第一回と同じじゃないかと思ったヤツは鋭い。
S:処理内容はほとんど同じです。違うのは表示文字列くらいですね。

III 解説

名前空間の利用宣言

03:using namespace std;
H:問題になるのは03行だな。
S:そこが今回の目玉です。名前空間の利用宣言ですね。
H:「std」という名前空間を使うぞと言っている。
S:英語をそのまま読んでも分かりますね。
06:  cout << "This is namespace program." << endl;
H:その効果が実際に出てくるのは06行目だ。
S:以前と違って「std::cout」や「std::endl」じゃなくて「cout」と「endl」だけになってるのが分かりますか?
H:微妙に名前が縮んでるわけだ。これが「using namespace std;」の効果になる。
S:昔の「std::cout」の時は名前空間「std」の「cout」って指定していたんです。
H:ところが、今回は「std」を使う宣言をしたもんだから、何も付けない場合は「std」名前空間が使われる。
S:結果として「cout」だけで、昔と同じモノを指しているわけです。
H:「endl」についても同じことが言える。

S:ちなみに、この宣言は同一スコープの中でだけ有効です。
H:ブロックの中で使うと、そのブロックを出たら無効になるってことだな。注意してくれ。

名前空間の作成

S:名前空間を作って、その中に色々入れるには次のようにすればいいです。
01:namespace xxx
02:{
03:  色々
04:}
H:これで新しく(もう有った場合はそれに追加して)名前空間「xxx」を開いて、色々なモノを入れられる。
S:名前空間の中に、更に名前空間を入れ子(ネスト)にすることもできますよ。
H:もちろん、この中身を使う時には「xxx::yyy」みたいに指定する必要があるぞ。
S:もしくは「using namespace xxx;」を宣言しておいてもいいですね。

名前空間の別名

H:ここはちょっと高度な話だ。
S:長い名前空間識別子を毎回打つのは大変ですよね。でもusingしてしまうと、名前の衝突が気になる…
H:そんな時には名前空間に別名(エイリアス)を付けてしまえばいい。
S:次のコードでは「veryverylongnamespace」に「shortname」という別名を付けます。
01:namespace shortname = veryverylongnamespace;
H:この宣言をしておくと、以降のコードでは「veryverylongnamespace::xxx」の代わりに「shortname::xxx」と書けるようになる。
S:例だとあまり短くなってませんが、ネストされた長い識別子などを短縮すると、かなり効果があります。
H:注意点は別名が既存の名前空間識別子と衝突してはいけないということだ。これじゃ名前空間を使う意味が無い。

IV 終わりに

S:以上が名前空間の基本です。比較的イメージしやすい機能だと思いますが、どうでしたか?
H:std 名前空間はシステムで使われているから、「using namespace std;」する機会は結構あるはずだぜ。
S:入門にはよく「おまじない」って言われていますが、こういうモノなんですね。
H:複数人で開発する場合とかに使われる事が多いな。大規模開発では必須だ。
S:次回は「例外」の予定です。それでは。
H:またな。

第三回 終了


一覧に戻る