OFとC++初心者の日記

OpenFrameworks と C++をハローワルドする日記

ネームスペースとは何だ?!

ハロー^^kyonです。
今日も少し勉強したよ^^

yoppa.org こちらのP137の勉強したメモです。

下記のコードが本文に記載されています。

#include <iostream>
using namespace std;
class Dog { // Dogクラスの定義
}; //Dogクラスの定義終了 (最後に";"が入るのに注意)
int main (int argc, char * const argv[]) { //メイン関数
}

ここで疑問が

「using namespace std;」とは何だ?!

■using namespace std;
標準の関数がこの「std」というネームスペースの中にあり、コードの中で簡単に利用するために「using namespace std;」と記載する。
(標準の関数とは、例えば、上記のコードに記載されている<iostream>のファイルの中にある「cout」や、vectorやmapなどがある)

#include <vector>

の場合も、ネームスペースはstdに設定されている。
そのため、「using namespace std;」を記載することにより「std::」の省略が可能になる。

具体的には下記の通りである。

using namespace std;を書かない場合

#include <iostream>
std::cout << "Hello, world!" << std::endl;

using namespace std;を書いた場合

#include <iostream>
using namespace std;
cout << "Hello, world!" << endl;

このように「std::」を書く必要がなくなる。

で、そもそも

「ネームスペース」とは何か

C++では、例えば、複数のファイルに同じ名前の関数を記載する場合に、重複しないように名前をつけたネームスペースに入れる必要がある。
主にヘッダーファイルで利用する。

具体的にはこのようにかく

// 名前空間 seal を定義する
namespace seal
{
    // ここに宣言する
    int foo()
    {
        // int foo()の定義
        ....
    }
    ...
};

上記の書籍のP144のコードの場合

#include <iostream>
using namespace std;
class Dog { // Dogクラスの定義
public:
string name; //犬の名前 (状態)
void bark(); //犬が吠える (動作)
}; //Dogクラスの定義終了 (最後に";"が入るのに注意)

は重複しない場合はこのままで良いが、

#include <iostream>
using namespace std;

namespace animals{
 class Dog { // Dogクラスの定義
 public:
 string name; //犬の名前 (状態)
 void bark(); //犬が吠える (動作)
 }; //Dogクラスの定義終了 (最後に";"が入るのに注意)
}

とかいたら他のファイルでも違うネームスペースでclass Dogを記載することができる。

ちなみに、呼び出す場合は

animals::Dog dog;
dog.bark();

または、

using namespace animals;
Dog dog;
dog.bark();

ちなみに、pyrhonの場合はファイルがそのままnamespaceになるから、自分で定義する必要がない。

namespace を参考に勉強させていただきました^^

またねーーー♡