cout如何区分基本类型?

dmi*_*tru 1 c++ types cout

由于我从C转换到C++,我对STL的格式输出有疑问.ostreams如何告诉另一种基本类型?

在C中,它的printf和格式化字符串非常简单,但在C++中,ostreams会以某种方式自动区分基本类型.这让我很困惑.

例如,在以下代码中,

int i;
float f;

std::cout << i << std::endl;
std::cout << f << std::endl;
Run Code Online (Sandbox Code Playgroud)

cout如何"知道" 是一个int而f是一个浮点数?

Man*_*agu 7

编译器将运算符转换为函数调用.以便

std::cout << i
Run Code Online (Sandbox Code Playgroud)

operator<<(std::cout, i)
Run Code Online (Sandbox Code Playgroud)

深埋在标准库头的内部的某处有函数声明(功能相当于):

std::ostream& operator<<(std::ostream& o, int i);
std::ostream& operator<<(std::ostream& o, double d);
Run Code Online (Sandbox Code Playgroud)

也就是说,operator<<超载了.进行函数调用时,编译器会选择与传入的参数最匹配的函数重载.

在这种情况下std::cout << i,int选择过载.在这种情况下std::cout<<d,double选择过载.

您可以通过一个人为的示例相当简单地看到函数重载:

#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);
}
Run Code Online (Sandbox Code Playgroud)

产生输出:

5
7.700000
Run Code Online (Sandbox Code Playgroud)

亲自尝试:http://ideone.com/grlZl.

编辑:正如Jesse Good指出的那样,所涉及的功能是成员函数.所以我们真的有:

std::cout << i
Run Code Online (Sandbox Code Playgroud)

std::cout.operator<<(i)
Run Code Online (Sandbox Code Playgroud)

在标题中有声明(相当于):

class ostream {
    ostream& operator<<(int i);
    ostream& operator<<(double d);
    ...
};
Run Code Online (Sandbox Code Playgroud)

然而,同样的基本思想仍然存在.

  • 并非所有`operator <<`都是自由函数,`int`和`float`重载都是[成员函数](http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt).`std :: cout.operator <<(int i);` (2认同)