C++中操作符重载

一、操作符重载属于什么?

在本文开始阐述之前,首先明确,操作符重载是一个具有特殊名的“ 函数 ”。 既然作为函数,那么,就具有函数的特性,一是形参表,二是返回值。 关键字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)、输入>>和输出<< 操作符必须定义为友元函数。

七、总结:

到此,又是文章该结尾的时候了,如果能正确地使用操作符重载,将大大提高程序的直观性和可读性,同时降低程序崩溃的概率比,愿对你有益。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值