2017-10-31 71 views
-3

std::cin >> xは、入力ストリームの値を変数xに格納します。 cinは、入力ストリームを可能な限り長くスキャンして、xの有効な表現(空白をスキップする)を取得することも知っています。ただし、この動作はさまざまなデータ型に対してどのように定義され、どのデータ型がサポートされていますか?cinとcoutはどのように異なるデータ型をサポートしていますか?

cinは、タイプごとに>>に異なるオーバーロードが設定されていますか?基本的なデータ型のみをサポートしていますか?

同様に、std::coutは値をプリントアウトする方法を知っていますか?私は文字列への暗黙的な変換を使用していると仮定していますが、確認できませんでした。

+1

いくつかの質問があります。第3部はhttps://stackoverflow.com/questions/2981836/how-can-i-use-cout-myclassの複製です –

+0

ありがとうございました。私は彼らが関係していたと仮定していました、そして、それに答えることは他の人に役立つでしょう。 –

+2

'の演算子>>'と出力のための ''演算子 ''は、それぞれの型に対してオーバーロードされます。基本的な型だけをサポートするのではない。 std :: stringは基本的ではなく、独自のクラスをサポートするために自分自身でオーバーロードすることができます。 'cout'は値を出力する方法を知らないので、渡している型の関連するオーバーロードはします。 – Steve

答えて

1

コンパイラは、さまざまな場所からoperator<<(又はoperator>>)という名前の関数のセットを収集:

  • 現在のスコープの
  • 左側オペランドのメンバーとその基底クラス
  • 名前空間左オペランド(friendキーワードを使用してクラス内で定義することができます)
  • 右オペランドのネームスペース(friendキーワード)内蔵のプリミティブ整数型に適用バージョン

それはその後にこれらの決定するために、「通常」の名前で関数を呼び出す場合と同様に、オーバーロード解決を実行

  • つかいます。暗黙的な変換はオーバーロードの解決中に考慮されますが、一般的にデータ型に対するiostreamのサポートは、暗黙的な文字列への変換よりも直接的な一致を提供することを含みます(たとえば、参照変換が優れているなど)。

    ここで、左側のオペランドはstd::cout(またはstd::cin)なので、メンバーまたはその名前空間をあまり制御できません。また、組み込みバージョンを変更することはできません。しかし、それでも新しい型のサポートを追加するいくつかの方法があります。プログラムの作成者、現在のスコープを使用し、ライブラリ作成者として、作成するクラスの名前空間を使用します。

  • +0

    ありがとうございます。この明確化により、私はさらに研究することができました。私はこの記事が非常に参考になることを発見しました:[C++のストリーム挿入(<>)演算子のオーバーロード](http://www.geeksforgeeks.org/overloading-stream-insertion-operators-c/) –

    関連する問題