编译器将运算符转换为函数调用。以便
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 << 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);
}
产生输出:
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);
...
};
然而,同样的基本思想也成立。