重载的运算符是带有特殊名称的函数,函数名是由关键字 operator 和其后要重载的运算符符号构成的。与其他函数一样,重载运算符有一个返回类型和一个参数列表。 一般参数列表根据运算符的特点进行设计。
返回值 operator运算符 (参数列表){
//function body
}
在这里给出一个技巧,我们可以把运算符看作函数名,例如:
a + b
我们可以看作:
operator+ (a,b);
再比如:
cout<<"Hello world";
我们可以看作:
operator<<(cout,"Hello world");
疑问:运算符重载,我们把运算符看作一个函数名,并且这个函数还有返回值,那么最后这个返回值给谁了?
比如我们跟上面一样重载了<<运算符,但是<<两边的cin和"Hello world"都是实参,而编写函数的时候我们返回了一个ostream类型的引用,问题是谁接收了这个引用?
在回答问题之前,我们可以想到:运算符重载,实际上就是将某个运算符通过基本运算符的组合,进而使其具有特定的效果。>
运算符重载中,返回值到底返回到哪了?以下面两个问题为例子来进行分析:
- 重载基本+运算符
struct data_{
int hour; //小时数
double temperature; //温度数
};
data_& operator+(const data_& d1,const data_& d2){
//应考虑返回一个新的data_而不改变参与运算的变量的原值
data_ D;
D.hour = d1.hour + d2.hour;
D.temperature = d1.temperature + d2.temperature;
return D;
}
当我们重载基本的+运算符的时候,我们应该不改变运算符两边变量的值,而应返回目标类型的新对象,而且在这里,我们确确实实需要创建一个第三方来保存运算结果,否则我们的函数毫无意义。
重载+运算符这个例子,跟我们常规编写函数的思想非常一致,都是根据参数,获得一个返回值,然后可以调用这个返回值。而对于ostream类型的对象,我们再来分析一下:
- 重载<<运算符:
ostream& operator<<(ostream& os,const data_& d){
return os<<"("<
该函数,是将参数os在函数体中修改以后,再将其返回,实际上,可以这样理解:
未重载"<<"时输出data_对象数据需要:
os<
此时,<<调用的是C++库中的函数,它完成数据的装入以及显示功能。
而重载"<<"后:
os可以直接用<<对data_类型的变量进行输出,即:
os<
而实际上,它会调用我们编写的重载函数,然后是在函数体中实现:
os<
而不用再显式地编写对应每个成员的输出语句。
在这个地方之所以产生疑问是因为:
传统的函数返回值,通常会被另一个第三方接收,而在这里,我们并没有发现任何一个第三方,所以就会产生返回值不知去向的感觉。实际上,将os返回以后,并没有任何第三方接收数据,也不需要接收数据,我们只需要在函数体中隐式地进行由基本<<实现的功能的堆叠,然后完成每个成员值的输出即可。这种堆叠就会导致我们认为<<产生了新的功能。实际上这种新的功能,还是由多个基本<<语句结合起来实现的。
由上可得,我们的
ostream& operator<<(ostream& os,const data_& d){
return os<<"("<
可以改写为:
void operator<<(ostream& os,const data_& d){
os<<"("<
验证:
函数实现:
ostream& operator<<(ostream& os,const data_& d){
return os<<"("<
输出:
data_ d;
d.hour = 12;
d.temperature = 33.9;
cout << d;
结果:
(12,33.9)
函数实现:
void operator<<(ostream& os,const data_& d){
os<<"("<
输出:
data_ d;
d.hour = 12;
d.temperature = 33.9;
cout << d;
结果:
(12,33.9)
(文章作学习笔记使用,本人水平有限,若有纰漏,欢迎指正)



