每日编程一小时(第一天)运算符重载实验
![](https://img2023.cnblogs.com/blog/3168296/202304/3168296-20230410210745595-567290723.png)
注:友元函数不能为常函数,所以题目中友元函数结尾的const得删去。
具体实现:
//类中声明: Complex operator+( Complex p ) const;//重载双目运算符'+' Complex operator-=( Complex p); //重载双目运算符'-=' friend Complex operator-(Complex c1,Complex c2) ;//重载双目运算符'-' //类外定义: Complex Complex::operator+(Complex p) const { p.real=p.real+this->real; p.imag=p.imag+this->imag; return p; }; Complex Complex::operator-=(Complex p) { this->real=this->real-p.real; this->imag=this->imag-p.imag; return *this; } Complex operator-(Complex p1,Complex p2) { p1.real=p1.real-p2.real; p1.imag=p1.imag-p2.imag; return p1; }
运行结果与pta所标案例一致。
在完成之前遇到个问题
在课本上所给的运算符重载案例清一色的都是以(类名 &)作为形参
这也就会是我们测试时先入为主的认为形参是&(引用)类型
这种形参类型本身并没有什么大问题,但是定义的方法不同这会导致在这道实验题中可能会导致原来类中的私有数据的值发生改变
例:
//类中声明: Complex operator+( Complex &p ) const;//重载双目运算符'+' Complex operator-=( Complex &p); //重载双目运算符'-=' friend Complex operator-(Complex &c1,Complex &c2) ;//重载双目运算符'-' //类外定义: Complex Complex::operator+(Complex &p) const { p.real=p.real+this->real; p.imag=p.imag+this->imag; return p; }; Complex Complex::operator-=(Complex &p) { this->real=this->real-p.real; this->imag=this->imag-p.imag; return *this; } Complex operator-(Complex &p1,Complex &p2) { p1.real=p1.real-p2.real; p1.imag=p1.imag-p2.imag; return p1; }
其运行结果为:
我们看看主函数
int main() { double r, m; cin >> r >> m; Complex c1(r, m); cin >> r >> m; Complex c2(r, m); Complex c3 = c1+c2; c3.Display(); c3 = c1-c2; c3.Display(); c3 -= c1; c3.Display(); return 0; }
输入案例为:
其中c1实部为4,虚部为2
c2实部为3,虚部为-5
由我们的定义可知的函数可知(传输右边的类中值)
c3 = c1+c2
使得c3实部为7,虚部为-3
此时c2实部为7,虚部为-3
c3=c1-c2
使c1,c3实部为4-7=-3,虚部为2-(-3)=5
c3 -= c1
使得c3实部为-3-(-3)=0;虚部为5-5=0;
所以会出现与所给案例不同的情况