1

CからC++に移行してから、STLのフォーマット出力について質問があります。ostreamは、ある基本的なタイプを別のタイプとどのように区別しますか?

printfとフォーマット文字列を使用するCでは、これは非常に簡単でしたが、C ++では、ostreamは基本的な型を自動的に区別します。それは私を困惑させます。

たとえば、次のコードでは、

int i;
float f;

std::cout << i << std::endl;
std::cout << f << std::endl;

coutは、 iがintであり、fがfloatであることをどのように「認識」しますか?

4

5 に答える 5

7

コンパイラは、演算子を関数呼び出しに変換します。となることによって

std::cout << i

になる

operator<<(std::cout, i)

標準ライブラリ ヘッダーの腸の奥深くに埋もれている場所に、関数宣言があります (機能的には次のものと同等です)。

std::ostream& operator<<(std::ostream& o, int i);
std::ostream& operator<<(std::ostream& o, double d);

つまり、operator<<過負荷です。関数呼び出しが行われると、コンパイラは、渡された引数に最適な関数オーバーロードを選択します。

の場合std::cout << iintオーバーロードが選択されます。の場合std::cout<<ddoubleオーバーロードが選択されます。

工夫された例を使用すると、関数のオーバーロードの動作をかなり簡単に確認できます。

#include <stdio.h>

void print(int i) {printf("%d\n", i);}
void print(double d) {printf("%f\n", d);}

int main()
{
   int j=5;
   double f=7.7;

   print(j);
   print(f);
}

出力の生成:

5
7.700000

自分で試してみてください: http://ideone.com/grlZl .

編集:Jesse Goodが指摘しているように、問題の関数はメンバー関数です。つまり、実際には次のようになります。

std::cout << i

になる

std::cout.operator<<(i)

そしてヘッダーには宣言があります(と同等):

class ostream {
    ostream& operator<<(int i);
    ostream& operator<<(double d);
    ...
};

ただし、基本的な考え方は同じです。

于 2012-05-15T01:48:41.807 に答える
3

タイプ(int、floatなど)ごとにoperator<<オーバーロードがあります。コンパイラは、コンパイル時に正しいものを選択します。一般に、operator <<の形式std::ostream& operator<<(std::ostream& stream, int number )は、であり、関数はstd名前空間で定義されたグローバル関数です。この関数の定義は、独自の名前空間で宣言することで上書きできます(これは、引数依存ルックアップを介して行われます)。

関数がストリームへの参照を返すという事実は、それらをつなぎ合わせることができることを意味します。ただ、operator <<が表示されるときはいつでも、それは実際には単なる関数呼び出しであることを覚えておいてください。

ご覧になりたい場合で、VSを使用している場合は、

C:\ Program Files(x86)\ Microsoft Visual Studio 9.0 \ VC \ include\ostream。

興味があれば、そこにすべての定義があります。

于 2012-05-15T01:34:43.750 に答える
2

2番目の引数の過負荷解決operator<<

于 2012-05-15T01:33:34.887 に答える
1

関数のオーバーロードは、コンパイル時のポリモーフィズムの一種です。簡単な例:

void times_two(int& x) { x *= 2; }
void times_two(double& x) { x *= 2; }

int i = 2;
double d = 2.5;

times_two(i);  // i now 4
times_two(d);  // d now 5.0

std::ostreamなどのの場合std::coutoperator<<()関数は同様の方法でオーバーロードします。GCC 3.4.4 に同梱されている標準ライブラリから:

__ostream_type&
operator<<(int __n);

__ostream_type&
operator<<(double __f);
于 2012-05-15T01:55:03.297 に答える
0

オーバーロードされたostream演算子<<です。C ++では、パラメーターに基づいて関数名をオーバーロードできます。これは基本的にここで起こっていることです。http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/

于 2012-05-15T01:34:42.540 に答える