操作符重载与临时对象

operator overloading(操作符重载-1,成员函数) this


inline complex& 

__doapl(complex* ths, const complex& r)

{

    ths->re += r.re;

    ths->im +=r.im;

    return *ths;  //*ths表明指针ths指向的object, 该return语句返回的是value

}


inline complex&

complex::operator += (const complex& r)

{

    return __doapl(this, r);

}


{

   complex c1(2,1);

   complex c2(5);

   c2 += c1; 

  //传递者为c1,为value, 然而操作符+=的重载函数作为接收者是以reference的形式接收的

}


而在inline complex& __doapl函数中,传回去返回的是*ths这个object,complex&为接收端,接收端用何种形式接收(reference / value)接收,传回去的返回端不管它。如果函数的设计足够好,用reference接收,速度快;而使用value接收的话速度慢。

return by reference 语法分析

 传递者无需知道接收者是以何种(reference / value)形式接收

如果像上面写的 c2 += c1; 进行运算时,inline complex& complex::operator +=(const complex& r){...}的返回类型可以为void,即改写为 inline void complex::operator += (const complex& r){ __doapl(this,r);}

但是如果使用者这样:c3 += c2 += c1使用,返回值为void,则无法进行运算。


1.5操作符重载与临时对象

当函数中的参数为类的对象时,尽量使用reference来传递,速度快,效率高。


operator overloading(操作符重载-2,非成员函数)(无this)


为了应对使用者可能会用到的运算方法

1.5操作符重载与临时对象

上面图片中的函数均为全局函数,即是非成员函数。


临时对象

1.5操作符重载与临时对象

上图中的complex(); 和complex(4,5);都是创建的没有名字的临时对象,且complex();由默认构造函数赋值为(0,0),临时对象所在行的代码运行结束后,立刻会从存储空间中消失。


1.5操作符重载与临时对象

需要注意上图中 正号 “+”的操作符重载函数的返回值类型这里为return by value,但是也可以return by reference,即定义为inline complex& operator + (const complex& x){ ... }


下图中的程序代码为 == 、 != 操作符函数的重载,判断是否相当返回bool值。

1.5操作符重载与临时对象

1.5操作符重载与临时对象


下面为共轭复数函数的定义:

1.5操作符重载与临时对象

注意:对于 << 操作符的重载,只可以写作 非成员函数 进行重载,不可以写作成员函数进行重载。

 <<的操作对象有两个,一个是cout,其类名为ostream,这个可以在STL中查询,所以函数的重载第一个参数为ostream& os,其前不可以加const,原因是传进去给os输出的东西,每一次的输出都会改变os的状态,所以不能加const。


相关文章:

  • 2021-12-08
  • 2021-06-21
  • 2021-09-11
  • 2022-12-23
猜你喜欢
  • 2021-09-09
  • 2021-07-04
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-02
  • 2021-11-14
相关资源
相似解决方案