由于我从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是一个浮点数?
编译器将运算符转换为函数调用.以便
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)
然而,同样的基本思想仍然存在.