5 操作符重载与临时对象
538字约2分钟
2023-07-28
5.1 操作符重载
在c++里我们可以定义加法等操作符,比如我们可以定义两个石头的加法
5.1.1 成员函数实现 / this
成员函数: complex :: function ....
前面带有class的名称(在class里先声明了的)
inline complex&
complex::operator += (const complex& r) {
return __doapl(this, r); //do assignment plus
}
所有的成员函数都带有一个隐藏的参数this
(是一个指针),this
指向调用这个函数的调用者
定义函数的时候,在参数列中不能写出来
this
,直接用即可函数里可写可不写,但当传入参数与成员变量名相同时要写
public: double real () const { return this->re; } //这里的this->可省略
c3 += c2 += c1; // c2 加了 c1 后如果返回 void 就无法进行 c3 的操作了
将操作符写为void函数也可以,但为了可以兼容c3+=c2+=c1
的形式,写成返回引用更好。
5.1.2 非成员函数实现
非成员函数没有this
应对三种使用方法,写出三种方式
非成员函数是global函数——为了后面两种使用方法
这些函数不能返回引用,必须值传递
在函数中创建的新变量 (local 变量),要返回
5.1.3 output函数 << 的重载
cout不认识新定义的这种复数,因此也需要对<<
进行操作符重载
只能全局函数,不能成员函数——导致使用时方向相反
#include <iostream.h>
ostream&
operator<<(ostream& os, const complex& x)
{
return os << '(' << real(x) << ',' << imag(x) << ')'; //自定义输出
}
ostream&
是cout
的 classname
参数传递:os 在函数中会变化,所以不能加
const
返回值传递:为了避免
cout << c1 << conj(c1);
连续输出,不用void
cout << c1
返回值需要与cout
类型一致
5.2 临时对象
classname ()
创建一个classname类型的临时对象——不需要名称,生命只有一行