記事ディレクトリ
名前空間の概念
概念:
C / C ++では、後で学習する変数、関数、およびクラスが多数存在し、これらの変数、関数、およびクラスの名前はすべてグローバルスコープに存在するため、多くの競合が発生する可能性があります。名前空間を使用する目的は、名前の競合や名前の汚染を回避するために識別子の名前をローカライズすることです。
名前空間キーワードの出現は、この問題を目的としています。
簡単に言うと、名前空間は、名前が同じ場合に名前を通常どおりに使用できるように表示されます。
名前空間の定義
名前空間を定義するには、namespaceキーワード、名前空間の名前、中括弧{}のペアを使用する必要があります。ここで、{}は名前空間のメンバーです。
方法1:通常の名前空間の定義
namespace N1 //N1是命名空间的名称
{
//用花括号{ }将命名空间的内容包起来
//命名空间的内容,即可以定义变量,也可以定义函数
int a;
int Add(int x, int y)
{
return x + y;
}
}
方法2:名前空間のネストされた定義
namespace N2
{
int a;
int b;
int Add(int x, int y)
{
return x + y;
}
namespace N3 //命名空间的嵌套定义
{
int c;
int d;
int Sub(int x, int y)
{
return x - y;
}
}
}
方法3:同じプロジェクトで同じ名前の複数の名前空間が許可され、コンパイラーは最終的にそれらを同じ名前空間に合成します。
namespace N1 //N1是命名空间的名称
{
//用花括号{ }将命名空间的内容包起来
//命名空间的内容,即可以定义变量,也可以定义函数
int a;
int Add(int x, int y)
{
return x + y;
}
}
namespace N1 //再次定义命名空间 N1
{
int Mul(int x, int y)
{
return x * y;
}
}
実際には次と同等です:
namespace N1 //N1是命名空间的名称
{
//用花括号{ }将命名空间的内容包起来
//命名空间的内容,即可以定义变量,也可以定义函数
int a;
int Add(int x, int y)
{
return x + y;
}
int Mul(int x, int y)
{
return x * y;
}
}
名前空間の使用
例:
#include<iostream>
namespace N
{
int a = 10;
int b = 20;
int Add(int x, int y)
{
return x + y;
}
int Mul(int x, int y)
{
return x * y;
}
}
int main()
{
printf("%d\n", a);//该语句编译出错,无法识别a
return 0;
}
コンパイラーからのフィードバックから、名前空間を定義した後、名前空間内の名前を直接使用すると、コンパイラーは実際に名前を認識または検出できないと大まかに推測できます。
名前空間の正しい使用
方法1:名前空間名とスコープ修飾子を追加する
int main()
{
printf("%d\n", N::a);//加命名空间的名称及作用域限定符::
return 0;
}
補足の基本概念:
スコープ:有効になり始めて期限切れになるプログラムスコープセグメント
ライフサイクル:プログラムの実行中にオブジェクトが存在する期間を指します。
2つの比較:
スコープとライフサイクルは、2つの完全に異なる概念です。
英語では、スコープは「スコープ」で表され、ライフサイクルは「期間」で表されます。
スコープは、ソースプログラムをコンパイルするときにのみ使用される静的な概念です。識別子のスコープとは、識別子が合法的に独立して表示されるソースファイル内の領域を指します。
ライフサイクルはランタイム(ランタイム)の概念であり、ロードから実行の終了までのプログラム全体のプロセスに変数が存在する期間を指します。
関数とデータ型は静的な概念であるため、ライフサイクルはなく、プログラムのコンパイル、実行、終了までのプロセス全体に存在します。
方法2:名前空間のメンバーを紹介するためにusingを使用する
using N::b;
int main()
{
printf("%d\n", N::a);//加命名空间的名称及作用域限定符::
printf("%d\n", b);//使用using引入命名空间的成员
return 0;
}
方法3:using名前空間namespace nameを使用して、すべての名前をインポートおよび展開します
using namespace N;//使用using namespace 命名空间名称引入,将所有名称全展开
int main()
{
printf("%d\n", a);
printf("%d\n", b);
return 0;
}
この方法の長所:完全に拡張され、使いやすい
短所:ライブラリ内のすべてのコンテンツが拡張されます。ライブラリ内の名前と同じ名前が定義されている場合、競合します(つまり、名前の汚染を引き起こしやすくなります)
注:通常、C ++を学習して演習を行う場合は、この欠点についてあまり考える必要はなく、直接使用するだけです。大規模なC++開発プロジェクトに実際に関与している場合にのみ、この問題に注意する必要があります。
#include<iostream>
//using namespace std;//C++库中的所有东西都是放到std命名空间中
using std::cout;
using std::endl;
int main()
{
cout << "hello world!" << endl;
//std::cout << "hello world!"<< std::endl;
int i = 1;
double d = 1.111;
cout << i << endl;
cout << d << endl;
return 0;
}