一、操作符重载属于什么?
在本文开始阐述之前,首先明确,操作符重载是一个具有特殊名的“ 函数 ”。 既然作为函数,那么,就具有函数的特性,一是形参表,二是返回值。 关键字operator后接需要定义的操作符。
二、函数形式:
返回类型 operator 操作符(参数列表)
说明:参数列表中,参数的个数取决于重载运算符的操作数个数。
如:+ (加法)就必须有两个操作数。C=A+B;
三、举个栗子:实现两个复数的加法
1。图示说明:
class Complex
{
public:
Complex(double real,double image)
:_real(real)
,_image(image)
{
}
//思路一:构造函数实现,将两个操作数分别传给函数,进行相加减,如下:
Add(const Complex& c1,const Complex& c2)
{
}
//很快你就会发现,在构造函数中,有一个隐藏得this 指针,这样的话,就相当于有三个操作数了。程序错误。
//思路二:去掉一个参数,返回相应类的引用。如下:
Complex& Add(const Complex& c)
{
_real+=c._real;//这里_real相当于this->_real;
_image+=c._image;
return ;
}
//走到这里,你又会发现,就算参数少了一个,但是不管是返回this还是返回c,都会使c1,c2的值发生变化
//思路三:这时候,也许你就会想到,返回引用会使值发生变化,那么返回值,而不是返回引用,是不是这问题就解决了呢?
Complex Add(const Complex& c )
{
complex temp(*this);
temp._real+=c._real;
temp._image+=c._image;
return 0;
}
};
//相应的主函数如下:
int main ()
{
Complex c1(1.0,2.0);
Complex c2(3.0,4.0);
Complex c3(C1.Add(c2));
return 0;
}
使用思路三的方法,毫无疑问可以得到我们想要的结果,可是,对于加法这种一目了然的操作,倘若写成:Complex c3(C1.Add(c2))这样的代码,程序的可读性是不是也太挫了些,不如c3=c1+c2这样来的直观。既然这样,就该今天的主角出场了:
加法运算符重载:
//还是在上述所在的类中
Complex operater +(const Complex& c)
{
complex temp(*this);
temp._real+=c._real;
temp._image+=c._image;
//在该函数中,将运算符+重载,在主函数中便可使用c1+c2这样的表达式。
四、不能重载的操作符有哪些?
(1)、 (. 成员选择符)
(2)、(.* 成员对象选择符)
(3)、(::域解析操作符)
(4)、(?:条件选择符)
(5)、(sizeof 求字节运算符)
除了=(赋值运算符)以外,基类被重载的操作符都将被派生类继承
五、能够重载的操作符有哪些?
除了上述5个不能被重载的操作符外,剩下的操作符基本都能被重载。
六、注意“事项:
(1)、不能通过其他符号来创建新的操作符
如:operator @;
void operator @() {}
(2)、重载操作符的参数必须有一个类类型或者枚举类型的操作数,
//如:
int operator + (const int _num1,const _num2 )//错误
{
}
(3)、用于内置类型的操作符,其含义不能变。
如:内置类型的整型+ ,不能改变其含义
(4)、不具备短求值的特性,重载操作符不能保证操作符的求值顺序,在重载&&和||时,对每个操作数都要进行求值,且对操作数的求值顺序不能做规定
(5)、作为成员函数的重载函数,其参数看起来比它的操作数少一个
(因为隐含一个默认的操作数this )
(6)、一般算数操作符定义为非成员函数,将赋值运算符定义为成员函数
(7)、操作符定义为非类的成员函数时,一般将其定义为友元
(8)、==和!=一般要成对重载。
(9)、自增自减操作符:前置时必须返回被增量(被减量)的引用;后置时,必须返回值
(10)、输入>>和输出<< 操作符必须定义为友元函数。
七、总结:
到此,又是文章该结尾的时候了,如果能正确地使用操作符重载,将大大提高程序的直观性和可读性,同时降低程序崩溃的概率比,愿对你有益。