C++ 运算符重载的基本概念
01 运算符重载的需求
C++ 预定义的运算符,只能用于基本数据类型的运算:整型、实型、字符型、逻辑型等等,且不能用于对象的运算。但是我们有时候又很需要在对象之间能用运算符,那么这时我们就要重载运算符,使得运算符能用于对象之间的运算。
比如,在数学上,两个复数可以直接进行+、-等运算,但在C++中,直接将+或-用于复数对象是不允许的。有时会希望,让对象也能通过运算符进行运算。这样代码就更简洁,也容易理解。
例如:
complexa 和 complexb 是两个复数对象,求两个复数的和,希望的能直接写成:complexa + complexb
这时我们就需要对 +
号运算符进行重载。
02 运算符重载的形式
运算符重载的实质就是函数重载,可以重载为普通函数,也可以重载为成员函数。运算符重载的基本形式如下:
下面举个例子,实现对复数对象的 +
和 -
运算符重载:
输出结果:
从上面的例子中,我们可以知道重载为成员函数和普通函数的区别了:
重载为成员函数时,参数个数为运算符目数减一。如:
c = a - b;
等价于c = a.operator-(b)
重载为普通函数时,参数个数为运算符目数。如:
c = a + b;
等价于c = operator+(a,b)
在上面的代码中,我把重载 +
号运算符的**普通函数**,在Complex
复数类中定义成了友元函数,目的是为了友元函数能访问对象的私有成员,否则会编译报错。
03 +号和-号重载函数的返回值和参数表
这里还有个值得思考的问题:
为什么重载-号和+号运算符函数的返回类型是
Complex
对象而不是Complex &
呢?为什么重载-号和+号的运算符函数的参数表是
const Complex & c
常引用类型而不是Complex c
呢?
首先先说一下参数表为什么是const Complex & c
常引用类型,首先如果参数表如果普通的对象形式Complex c
,那么在入参的时候,就会调用默认的赋值(拷贝)构造函数,产生了一个临时对象,这会增大开销,所以就采用引用的方式,同时又为了防止引用的对象被修改,所以就定义成了const Complex & c
常引用类型。
再来说一下返回值为什么是普通Complex
对象,因为本次 - 号和 + 号运算符的函数执行之后,需要返回一个新的对象给到左值。
版权声明: 本文为 InfoQ 作者【小林coding】的原创文章。
原文链接:【http://xie.infoq.cn/article/e57cf32dc4f67e3bf865071b8】。文章转载请联系作者。
评论