1.12 运算符重载
C和C++代码精粹
在C++中你可以重载运算符,例如,定义一个复数的数据类型如下:
struct complex
{
double real, imag;
};
假如能使用中缀符号用于复数加法,那将会相当方便。如:
complex c1,c2;
…
complex c3=c1+c2;
当编译器遇到如c1+c2这样的表达式时,将查找下边两个函数中的一个(只须其中的一个存在):
operator+(const complex&,const complex &); //全局函数
complex::operator+(const complex &); //成员函数
关键字operator是函数名的一部分。为实现两个复数的加法可以将operator+定义为全局类型,如下:
complex operator+(const complex &c1,const complex &c2)
{
complex r;
r.real=c1.real+c2.real;
r.imag=c1.imag+c2.imag;
return r;
}
程序清单1.14 运算符+和运算符<<在复数中的应用
#include <iostream>
using namespace std;
struct complex
{
double real, imag;
complex(double = 0.0, double = 0.0);
};
complex::complex(double r, double i)
{
real = r;
imag = i;
}
inline ostream& operator<<(ostream &os, const complex &c)
{
os << '(' << c.real << ',' << c.imag << ')';
return os;
}
inline complex operator+(const complex &c1, const complex &c2)
{
return complex(c1.real+c2.real,c1.imag+c2.imag);
}
不允许重载系统中预定义的操作,例如,不允许重载两个整型数相加。因此,在重载操作中至少有一个操作数是用户自定义类型。
流库“知道”怎样通过运算符重载来格式化各种系统预定义的数据类型。例如,ostream类中,cout是一个实例,它为所有的系统预定义的数据类型都重载了操作符<<,当编译器看到表达式:
cout<<i;
这里i是整型,它产生以下的函数运算:
cout.operator<<(i); //ostream::operator<<(ostream&,int)
这样可以正确地格式化数据。
程序清单1.14表明如何通过重载用于复数的运算符<<来扩展标准流(输出在程序清单1.5中)。编译器将表达式
cout<<c
转换成下面的函数调用(在这里c是一个复数):
operator << ( cout ,c)
这将依次采用operator<<(ostream&,const complex&)将操作分解成格式化系统预定义类型的对象。这个函数也返回流,因此,可以在一个单独的语句中链接多个插入流。如,表达式
cout<<c1<<c2
变为
operator<<(operator<<(cout,c1),c2)
这要求operator<<(ostream&, const complex&)返回流,为了高效这是通过引用来实现的。
本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。