1、运算符重载简介
(1)为什么引入运算符重载机制?
C++ 中的预定义的运算符:“+、-、*、/、%、^、&、~、!、|、=、<<>>、!=、…” 只能作用在基本数据类型上面,但是有些时候希望类类型之间也可以使用这些运算符进行运算(比如说:两个复数的运算),并且这种需求是合理的。基于这种需求,C++语言引入了运算符重载这一概念。
(2)C++运算符重载机制目的?
扩展C++中提供的运算符的适用范围,使之能作用于类类型数据上。
(3)对C++运算符重载机制的评价?
运算符重载机制增强了C++语言的功能,但是同时也增加了语言自身的复杂性。
2、运算符重载的概念
运算符重载,就是对已有的运算符(C++中预定义的运算符)赋予多
重的含义,使同一运算符作用于不同类型的数据时导致不同类型的
行为。
3、具体实现
(1)实现的实质
运算符重载的实质是编写以运算符作为名称的函数。这样的函数称之为运算符函数。
(2)运算符函数的类型:
- 运算符函数可以为全局函数。
- 运算符函数也可以为类的成员函数。
(3)运算符函数的特点:
- 把含运算符的表达式转换成对运算符函数的调用。
- 把运算符的操作数转换成运算符函数的参数。
- 运算符被多次重载时,根据实参的类型决定调用哪个运算符函数。
(4)两种类型运算符重载的不同之处
- 对于全局类型的运算符函数, 重载为成员函数时,参数个数为运算符目数减一。
- 对于类的成员函数类型的运算符函数,重载为普通函数时,参数个数为运算符目数。
4、举例
class Complex
{
public:
double real,imag;
Complex( double r = 0.0, double i= 0.0 ):real(r),imag(i)
{
}
Complex operator-(const Complex & c);
};
Complex operator+( const Complex & a, const Complex & b)
{
return Complex( a.real+b.real,a.imag+b.imag); //返回一个临时对象
}
Complex Complex::operator-(const Complex & c)
{
return Complex(real - c.real, imag - c.imag); //返回一个临时对象
}
int main()
{
Complex a(4,4),b(1,1),c;
c=a+b; //等价于c=operator+(a,b); +号触发全局类型符号函数的调用,并且将a,b作为符号函数的参数。将函数的返回值赋值给c。
cout<<c.real << "," << c.imag << endl;
cout<<(a-b).real << "," << (a-b).imag << endl;//a-b等价于a.operator-(b)。对象a- 触发对象a的成员符号函数的调用,将b作为参数传递给该符号函数。函数的返回值是一个complex对象的引用,通过该引用访问这个对象的成员变量real和imag。
return 0;
}
/*
输出:
5,5
3,3
*/