9

を使用coutするには、両方を指定する必要があります。

#include<iostream>

using namespace std;

どこでcout定義されていますか?でiostream、正しいですか?それで、それiostream自体が名前空間にあるということstdですか?

の使用に関する両方のステートメントの意味は何coutですか?

なぜ両方を含める必要があるのか​​ 混乱しています。

4

4 に答える 4

9

iostreamcout が定義されているファイルの名前です。一方、stdは名前空間であり、(ある意味で) Java のパッケージと同等です。

cout は、iostreamstd 名前空間内のファイルで定義されたインスタンスです。

cout別の名前空間に別のインスタンスが存在する可能性があります。そのため、名前空間coutからインスタンスを使用することを示すには、次のように記述する必要がありますstd

std::cout、範囲を示します。

std::cout<<"Hello world"<<std::endl;

std::どこでも回避するには、using句を使用できます。

cout<<"Hello world"<<endl;

それらは2つの異なるものです。1 つはスコープを示し、もう 1 つは の実際の包含を示しcoutます。

あなたのコメントに応えて

iostream で、名前が付けられた 2 つのインスタンスcoutが異なる名前空間に存在するとします。

namespace std{
   ostream cout;
}
namespace other{
   float cout;//instance of another type.
}

を含めた後も<iostream>、名前空間を指定する必要があります。この#includeステートメントは、「ねえ、std ::でcoutを使用してください」とは言いません。usingそれが、スコープを指定するためのものです

于 2010-04-15T18:56:07.063 に答える
2

C++ 実装で C スタイルのヘッダー ファイルを使用している場合 (多くの場合)、次のようなファイルが含まれています。

#include ... // bunches of other things included

namespace std {

... // various things

extern istream cin;
extern ostream cout;
extern ostream cerr;

... // various other things

}

std は、C++ 標準が、標準のもののほとんどが存在する必要があると述べている名前空間です。これは、グローバル名前空間が過密になるのを防ぐためです。 t は、標準的なものの名前として既に使用されています。

と言う事で

using namespace std;

名前を検索するときに、グローバル名前空間に加えて名前空間 std で検索することをコンパイラに伝えています。コンパイラがソース行を認識した場合:

return foo();

using namespace std;行の後のどこかで、fooその行の要件を満たす foo が見つかるまで、さまざまな名前空間 (スコープに似ています) を探します。特定の順序で名前空間を検索します。最初にローカル スコープ (実際には名前のない名前空間) を調べ、次に最もローカルなスコープを関数の外側まで何度も繰り返し、次に外側のオブジェクトの名前付きのもの (この場合はメソッド) を調べ、次にグローバル名 (この場合は関数、私が無視しているばかげてオーバーロードされていない限り () )、次にusing namespace std;行を使用した場合は std 名前空間で。最後の 2 つの順序が間違っている可能性があります (グローバルの前に std が検索される可能性があります) が、それに依存するコードを作成することは避けてください。

于 2010-04-15T19:18:03.430 に答える
1

coutiostream 内で論理的に定義されます。論理的には、実際にはファイル iostream にある場合もあれば、iostream から含まれるファイルにある場合もあります。いずれにせよ、iostream をインクルードするのが の定義を取得する正しい方法ですcout

iostream のすべてのシンボルは名前空間にありますstd。シンボルを使用するにはcout、コンパイラにそれを見つける方法 (名前空間など) を伝える必要があります。いくつかの選択肢があります。

// explicit
std::cout << std::endl;

// import one symbol into your namespace (other symbols must still be explicit)
using std::cout;
cout << std::endl;

// import the entire namespace
using namespace std;
cout << endl;

// shorten the namespace (not that interesting for standard, but can be useful
// for long namespace names)
namespace s = std;
s::cout << s::endl;
于 2010-04-15T18:58:18.417 に答える
1

#include <iostream>、cout を定義するヘッダー ファイルを参照します。cout を使用する場合は、常にインクルードが必要です。

する必要はありませんusing namespace std;。これは、名前空間が明示されている場所ではなく、省略形coutなどを使用できるようにするだけです。個人的には、より冗長であることは確かですが、意味を明確にする必要があるため、使用しないことを好みます。endlstd::coutstd::endlusing namespace ...

于 2010-04-15T18:58:33.627 に答える