なぜ名前名が必要なのですか
クラスのロールコールのシーンをシミュレートするプログラムがあり、クラスに同じ名前の学生がいるとします。現時点では、教師は名前を直接呼び出すことは絶対にありませんが、違いを示すために同じ名前の名前にいくつかの記号や特徴を追加します。
プログラムは不器用なものであり、事前設定に従って名前を段階的に展開するだけです。同じ名前の生徒がいるため、緊急に対処することはありません(区別するために変更を加えるなど)。
ここでの先生はルールをまとめることであり、生徒は変数であることが大まかに理解できます。この種の名前の競合の問題は命名空间污染问题
1と呼ばれます。
大規模なプロジェクトの場合、プロジェクトを独立したサブモジュールに分割してからマージする必要があることがよくあります。
そして、ほとんどの人が一般的に使用する名前は同じになりやすいです。
C++
別の方法、つまりを提供します命名空间
。
使い方
上記の例では、名前名は次のように使用されます。
//老刘写的
namespace Liu{
int id;
//...
void fun();
}
//老郭写的
namespace Guo{
int id;
//...
void fun();
}
::
C++
使用するように指定された名前名の解決演算子ドメイン。
したがって、使用する場合は次のようLiu::id
になります。Guo::id
注:
名前空間は、他の内部グローバルスコープで定義できますが、クラス定義または関数1では定義できません。
だけでなく、名前や他の宣言は、このようなクラス、関数として、また、名前空間内で宣言または定義することができ、外部の名前空間の定義できるため、変数の内部名前空間宣言または定義することができtypedef
、#define
そうとは名前空間に表示されます2。
使用する
ではC++
、私たちはしばしば見std
、それは実際に標準ライブラリの名前空間です。
std::cout << "Hello Word ! " << std::endl;
上記はフラグ出力です。標準ライブラリを使用するたびに名前を追加すると、非常に面倒です。
結局のところ、怠惰であることはプログラマーにとって大きな動機です。
C++
名前付けメンバーを使用するためのより簡潔な方法を提供しますusing
。
この命令は、コンパイラーにコードビハインドを指示し、デフォルトのネームスペースでusing
指定されたネームスペースに設定します。その後、上記のコードは次のように書き直すことができます。
using namespace std;
cout << "Hello Word ! " << endl;
さらにusing
、変数/メソッドをターゲットにすることもできます
using namespace Liu::id;
コンパイルとリンクの観点から、コードに表示される変数名、関数名、およびクラス名はすべてシンボルです。変数名や関数名など、メモリの場所を参照するシンボルもあります。typedef
エイリアス定義2のタイプなど、単なる新しい名前のシンボルもあります。
個別の名前付け
スコープとは異なり、名前付けは不連続になる可能性があります。名前付けは、個別の定義部分の合計で構成され、名前付けは累積1です。
同じ用途A文件
で命名空间A
、を増やして、いくつかのコンテンツを追加することができます。B文件
命名空间A
namespace Liu{
int id;
//...
void fun();
}
つまり、上記のコードは、新しい名前名を定義することも、既存の名前名に追加することもできます。
注目に値するのは、パーツが別のファイルで定義された名前名を要求する必要がある場合でも、名前3を宣言する必要があるということです。
ネストされた名前名
以下に示すように、名前空間はネストでき、ある名前空間を別の名前空間に定義できます。
namespace namespace_name1 {
// 代码声明
namespace namespace_name2 {
// 代码声明
}
}
次のように使用します。
// 访问 namespace_name2 中的成员
using namespace namespace_name1::namespace_name2;
// 访问 namespace:name1 中的成员
using namespace namespace_name1;