操作符重载与临时对象
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,则无法进行运算。
当函数中的参数为类的对象时,尽量使用reference来传递,速度快,效率高。
operator overloading(操作符重载-2,非成员函数)(无this)
为了应对使用者可能会用到的运算方法
上面图片中的函数均为全局函数,即是非成员函数。
临时对象
上图中的complex(); 和complex(4,5);都是创建的没有名字的临时对象,且complex();由默认构造函数赋值为(0,0),临时对象所在行的代码运行结束后,立刻会从存储空间中消失。
需要注意上图中 正号 “+”的操作符重载函数的返回值类型这里为return by value,但是也可以return by reference,即定义为inline complex& operator + (const complex& x){ ... }
下图中的程序代码为 == 、 != 操作符函数的重载,判断是否相当返回bool值。
下面为共轭复数函数的定义:
注意:对于 << 操作符的重载,只可以写作 非成员函数 进行重载,不可以写作成员函数进行重载。
<<的操作对象有两个,一个是cout,其类名为ostream,这个可以在STL中查询,所以函数的重载第一个参数为ostream& os,其前不可以加const,原因是传进去给os输出的东西,每一次的输出都会改变os的状态,所以不能加const。