C ++名前空間

C Namespace



C ++の名前空間は、一般化されたスコープです。その宣言は、予約語である名前空間で始まり、プログラマーが選択した名前、中括弧で囲まれたブロックが続きます。このブロックには、C ++オブジェクト、関数、およびその他のエンティティの基本的な宣言や定義が含まれています。

次のプログラムで、グローバルスコープ内の次の2つのスカラーステートメントについて考えてみます。







#含む
名前空間stdを使用する;

intvarId= 5;
浮くvarId= 2.3;

int主要(()。
{{

戻る 0;
}

このプログラムをコンパイルしようとすると、コンパイルエラーが発生します。同じ名前の2つの変数があります。 varId 。それらは2つの異なるタイプの2つの異なる変数ですが、 int浮く 、コンパイラは、2つの宣言が同じ名前であるため、それらを拒否します。次のプログラムは、2つの異なる一般化されたスコープで同じ名前の変数を宣言することにより、この問題を解決します。



#含む
名前空間stdを使用する;

名前空間NA
{{
intvarId= 5;
}

名前空間NB
{{
浮くvarId= 2.3;
}

int主要(()。
{{
費用<<NA:::varId << 'NS';
費用<<NB:::varId << 'NS';

戻る 0;
}

出力は次のとおりです。



5
2.3

上記のプログラムには2つの名前空間があります。 NA 、整数の定義があり、 NB 、floatの定義がありますが、NAの整数と同じ名前です。最後に、プログラムが実行されたとき、2つの異なる変数に同じ名前が使用されました。 2つの異なる変数の同じ名前にアクセスするには、名前空間の特定の名前を使用し、その後に共通の識別子を続ける必要があることに注意してください。名前空間名と共通識別子は、スコープ解決演算子で区切られています。 ::: 。名前空間の名前は、オブジェクトを区別します。





この記事では、名前空間の基本的な概念と、C ++プログラミング言語でのその使用法について説明します。この記事に従うには、C ++言語の基本的な知識が必要です。この記事では簡単に説明されていますが、C ++スコープの知識も必要です。 C ++スコープの詳細については、linuxhint.com Webページの検索ボックスで「ScopeinC ++(引用符なし)」というフレーズを検索し、Enterキーを押してください。これにより、この著者が書いた記事にたどり着きます。

記事の内容

名前空間とは何ですか?

宣言型領域は、エンティティ(変数)の名前が有効なプログラムの最大の部分です。この領域はスコープと呼ばれます。 C ++の名前空間は、名前の競合を解決することを主な目的とする一般化されたスコープです。名前空間には、エンティティの基本的な宣言や定義があります。



グローバル名前空間とその問題

グローバル名前空間はグローバルスコープです。次の短いプログラムを検討してください。

#含む
名前空間stdを使用する;

intident= 55;
浮くident= 12.17;

int主要(()。
{{

戻る 0;
}

上記のプログラムには、2つの変数があり、どちらも呼び出されます ident 。これらの変数はグローバルスコープにあります。つまり、それらはグローバル名前空間にあります。このプログラムをコンパイルしようとすると、エラーメッセージが表示されて失敗します。グローバルスコープは同じ名前の複数の変数を受け入れないため、カスタム名前空間が必要です。

カスタム名前空間

名前空間には名前が1つだけではありません。代わりに、名前空間には、他の名前のセットとの競合を避けるために名前のセットがあります。コードの下位で競合を回避するには、各名前の前に名前空間の名前を付け、 ::: 。次のプログラムは、2つのカスタム名前空間を使用してこれを示しています。

#含む
名前空間stdを使用する;

名前空間NA
{{
intvarInt= 6;
浮くflt;
}

名前空間NB
{{
intvarInt= 7;
浮くflt;
}

int主要(()。
{{
費用<<NA:::varInt << 'NS';
費用<<NB:::varInt << 'NS';
NA:::flt = 2.5;
NB:::flt = 4.8;
費用<<NA:::flt << 'NS';
費用<<NB:::flt << 'NS';

戻る 0;
}

出力は次のとおりです。

6
7
2.5
4.8

名前に注意してください NA :: fltNB :: flt 最終的にはで定義されています 主要() 関数。 C ++では、グローバルスコープでこのような定義を行うことはできません。

カスタム名前空間は、グローバル名前空間のネストされた名前空間であることに注意してください。

使用指令

名前空間を宣言した後に名前だけでなく、namepace :: nameを常に入力しないようにするには、 を使用して 指令。使用する構文 を使用して ディレクティブは次のとおりです。

名前空間Namespace_nameを使用する;

NS を使用して ディレクティブはプリプロセッサディレクティブではないため、セミコロン(;)で終わります。

次のプログラムは、 を使用して ディレクティブなど:

#含む
名前空間stdを使用する;

名前空間NB
{{
intvarInt= 7;
int関数(()。
{{
戻るvarInt;
}
}

intfn(()。
{{
名前空間NBを使用;
intmyVar2=関数(()。;
// NBの他のオブジェクトと関数が続きます。
戻るmyVar2;
}

intmyVar3=NB:::関数(()。;

int主要(()。
{{
費用<<fn(()。 << '' <<myVar3<< 'NS';

戻る 0;
}

このプログラムの出力は次のとおりです。 7 7 。用語 名前空間NBを使用します。 の先頭に配置されています fn() 意味。 NS func() NB名前空間からは、そのすぐ下で呼び出されます。 注意::

グローバルスコープ(グローバル名前空間)で宣言された変数は、宣言のポイントからファイルの終わりまで見られます。また、ネストされた名前空間(ネストされたスコープ)にも見られます。 fn() 上記の関数スコープ。 NS を使用して ディレクティブは、それが配置された位置からそれが配置されたスコープの終わりまでその名前空間を結合します。

名前 func() NB名前空間からは下に表示されません fn() 定義のため 名前空間NBを使用します。 関数スコープ(ブロック)内に配置されました。この状態で使用するには func() NB名前空間ブロック(スコープ)の外側では、その前に 注意:: 、次のステートメントのように:

intmyVar3=NB:::関数(()。;

NS を使用して ディレクティブは、その名前空間を、配置された位置から外側のネストされた名前空間の最後まで、外側のネストされた名前空間と結合します。次のプログラムでは、NA名前空間がグローバル名前空間に結合されています。次に、両方の名前空間が fn() 関数定義名前空間。NB名前空間と結合されます。 NB名前空間は、 fn() 関数定義、および前の2つの名前空間は、ファイルの終わりまで続きます(コードを読み通します)。

#含む
名前空間stdを使用する;

名前空間NA
{{
intvarInt= 6;
int関数(()。
{{
戻るvarInt;
}

}

名前空間NB
{{
intvarInt= 7;
int関数(()。
{{
戻るvarInt;
}
}

名前空間NAを使用する;
intmyVar0=varInt;
// ::およびNBの他のオブジェクトと関数が続きます。

intfn(()。
{{
intmyVar1=varInt;
名前空間NBを使用;
intmyVar2=NB:::関数(()。;
//このスコープの終わりまで、NBの他のオブジェクトと関数が続きます。
戻るmyVar1+myVar2;
}

// ::とNBのオブジェクトと関数のみが続きます。

intmyVar3=NB:::関数(()。;

int主要(()。
{{
費用<<myVar0<< '' <<fn(()。 << '' <<myVar3<< 'NS';

戻る 0;
}

出力は 6、13、7

ノート: グローバル名前空間はで示されます ::: 、次のスコープ解決演算子の前には何もないことを意味します。

ステートメントの下に、 名前空間NAを使用します。 グローバル名前空間とNA名前空間の変数は、ソース名前空間を指定せずに使用できます。次のステートメントは varInt NA名前空間の。グローバルとNAを組み合わせた名前空間領域は、 fn() 関数の名前空間。だから、 varInt の最初のステートメントの fn() 関数スコープは、NA名前空間のものです。

グローバル名前空間とNA名前空間の領域は、 fn() スコープ、後 int myVar2 = NB :: func(); 、NB名前空間の名前は、でのみ使用できます。 fn() 前に付けずにスコープ 注意:: 、NAおよびグローバルネームスペース(ブロック)で発生しなかった場合のみ。それ以外の場合は、前に付ける必要があります 注意:: 。 NAとグローバルの結合された名前空間の領域は、 fn() 定義とに 主要() ファイルの終わりまで機能します。

NB名前空間の拡張は int myVar2 = NB :: func(); の中に fn() ブロックし、の終わりで終了します fn() 定義ブロック。

ノート: リージョンが結合されている名前空間は、異なる名前空間ブロックで同じ変数名を使用しないでください。これにより、競合が発生する可能性があります。

名前空間リージョン

名前空間はスコープです。グローバル名前空間(グローバルスコープ)とは別に、すべての名前空間をブロックで宣言する必要があります。そのブロックは、名前空間の分散されている可能性のある領域の最初の部分です。 usingディレクティブを使用すると、名前空間を他のスコープの領域として拡張できます。

名前空間本体で宣言されたエンティティは名前空間のメンバーと呼ばれ、これらの宣言によって名前空間の宣言領域に導入された名前は、名前空間のメンバー名と呼ばれます。

ネストされた名前空間

次のプログラムは、ネストされた名前空間を示しています。

#含む
名前空間stdを使用する;

名前空間A
{{
int= 1;
名前空間B
{{
int= 2;
名前空間C
{{
int= 3;
}
}
}

int主要(()。
{{
費用<<::: << '' <<:::NS::: << '' <<:::NS:::NS::: << 'NS';

戻る 0;
}

出力は次のとおりです。

1 2 3

スコープ解決演算子を使用して3つの値にアクセスしていることに注意してください。

標準の名前空間

C ++には、標準ライブラリと呼ばれるライブラリがあります。このライブラリ内のオブジェクト、関数、およびその他のエンティティの名前は、標準名前空間と呼ばれる名前空間からのものであり、次のように記述されます。 時間 。標準ライブラリにはサブライブラリが含まれており、これらのサブライブラリの1つは次のとおりです。 iostream 。 NS iostream ライブラリにはオブジェクトが含まれています 費用 、コンソール(ターミナル)に結果を送信するために使用されます。

名前 費用 にある必要があります 時間 名前空間。使用するには iostream そのと 時間 名前空間の場合、プログラムは次のようになります。

#含む
名前空間stdを使用する;

の使用に注意してください を使用して ディレクティブと 時間 。用語 #含む プリプロセッサディレクティブであり、セミコロンで終わらない。ディレクティブの位置にiostreamファイルが含まれています。

結論

名前空間はスコープです。名前空間の説明(定義)には、C ++オブジェクト、関数、およびその他のエンティティの基本的な宣言や定義が含まれています。名前空間定義の外では、名前は次の構文でアクセスできます。 namespaceName :: name 。グローバル名前空間(グローバルスコープ)とは別に、すべての名前空間をブロックで宣言する必要があります。そのブロックは、名前空間の分散されている可能性のある領域の最初の部分です。とともに を使用して ディレクティブの場合、名前空間は他のスコープの領域として拡張できます。リージョンが結合されている名前空間は、異なる名前空間ブロックで同じ変数名を使用しないでください。名前の競合が発生する可能性があります。

Chrys