2013年7月31日水曜日

名前空間とは?

前回の最後に、 std::cout, std::endln の std:: の部分が面倒であるという話をしました。

ソースファイルにこんなおまじないを追加すると、std::を書かなくて済み
少しだけ手間が省けます。

using namespace std;

名前空間stdを使用したC++版超有名!?なプログラム
#include <iostream>

using namespace std;
int main(void)
{
    cout << "Hello, Work!" << endl;

    return 0;
}

どうでしょうか、おまじない追加前は、std::coutやstd::endlは std という名前空間の中にあることを
明示する必要がありました。
しかし、using namespace std; を記述すれば、その後はcout, endl と記述するだけでよいのです。


名前空間もC++の大事な概念です。
いきなり難しい話になってしまいました。(汗)
今はこういう話がある程度に流していただいて構いません。

この仕組みを使うことで、グローバル変数や関数の有効範囲を分割できます。

実際にどういう時に使うかというと、複数のライブラリやソースファイルを使用する場合です。
例えば次の2つのソースファイルを見てください。

peach.cpp                           pine.cpp
  :                 :
int GetPrice() {                    int GetPrice() {
    return 150;                         return 298;
}                                       }
    :                                      :

peach.cpp と pine.cpp は同じ場所にあるものとします。
そして、両方で GetPrice()という関数を宣言しています。
このままだと、コンパイル時に関数名が重なってしまい、リンクエラーになってしまいます。

これを解決するためには、関数の有効範囲に名前をつけて分割し、重複しないようにします。

名前空間を定義した2つのファイル
peach.cpp                           pine.cpp
namespace Peach {              namespace Pine {
    int GetPrice() {                    int GetPrice() {
        return 150;                         return 298;
    }                                       }
}                                       }


では、いざこの関数を使いたいときはどうするか?
どちらのGetPrice()を使うか区別できないと困りますよね。(^_^;)

そこで、名前空間内の変数や関数を使うときに
 「名前空間名::関数名(変数名やクラス名)」 と記述します。

先ほどの例に当てはめると、このようになります。

 cout << Peach::GetPrice() << endl;
  cout << Pine::GetPrice() << endl;

もし頻繁に同じ名前空間を使うのであれば、std:: の時と同様、ソースファイルの頭に
この例ではusing namespace Peach; と記述すると、Peach:: を指定する必要がなくなります。

ただし、使用する側で重複が発生した場合には、結局 名前空間名:: が必要です。
using namespace宣言は、共通関数などに限定した使い方がよいでしょう。^^


今日の名言 超長いです(^_^;)
 少女時代の私は綺麗だと思われたくてたまりませんでした。私なんか誰の目にも止まらない、
美しいと褒めてくれるはずもないと思い込んでいたからです。「あんたみたいな、みにくいアヒルの子に、ハンサムな彼氏なんかできっこないわ」と、よく姉妹たちにからかわれたものでした。
 私はいつも恥ずかしい思いをしていました。服は叔母さんのお古の仕立て直しばかりだし、
ダンスもスケートもからきし駄目だし、よその女の子みたいに綺麗じゃないし、パーティーではいつも仲間はずれだし...。
 いまでもはっきり覚えています。クリスマス・パーティーの席で私がいつものように一人ぼっちでいると、一人の若者が「踊りませんか」と話しかけてくれたうれしさを!彼の名はフランクリン・D・ルーズヴェルト。
 二十年以上もの間、私は劣等感と恐怖心に苛まれてきました。私の家系は、母も祖母も叔母たちも、揃いも揃ってニューヨーク社交界きっての美人揃いなのに、どうしたわけか私一人だけが不器量なので恥ずかしくてたまらなかったのです。母はよく訪問客に語ったものです。「エレノアったら、あんまり年寄り臭いので、皆からおばあちゃんとよばれているのですよ」
 こんな私に勇気を与える転機となったのは、私よりもっと不幸な方々を助けてあげる事でした。例えば、1910年には、夫はニューヨーク州の上院議員として、他の18人の議員とともに、ある悪徳議員と闘っていましたので、アルバニーの私達夫婦の家は会議所みたいになり、毎日毎晩のように泊まりこみで討議が続けられていました。いたたまれなくなった私が他の議員の方々の奥さんに会ってみると、ホテルの一室でションボリ一人暮らしをしている方々が多いのにびっくりしました。ご主人以外は誰ひとり知らない、この気の毒な奥さん方を元気づけ、励ましているうちに、いつしか私にも勇気と自信が湧いてきました。
 この世の中で恐怖心ほど人の心を傷つけるものはありません。私よりはるかに不幸な方々を助けることにより、私は自分の恐怖と闘い、ついにそれを克服したのです。恐ろしくて手が出なかったことを何とかしてやり遂げれば、誰でも恐怖心を克服できる、と私は信じます。ただしそのためには、絶えずこうしたことをやり続けて、成功の実績を積み重ねることが第一です。
                                 
                                          エレノア・ルーズヴェルト