C++运算符重载


题目:以复数的运算为例,实现C++运算符重载:
复数的形式: a+bi 代表一个复数,其中a为实部,b为虚部,i为复数符号(i^2 = -1)。
运算法则:
加法:(a + bi) + (c + di) = (a + c) + (b + d)i
减法:(a + bi) - (c + di) = (a - c) + (b - d)i
乘法:(a + bi) * (c + di) = ac + adi + bci + bdi^2 = (ac - bd) + (bc + ad)i
除法:(a + bi) / (c + di) = (ac + bd) / (c2 + d2) + ( (bc - ad) / (c2 + d2) )i
复数类的运算符重载函数包括:
基本算术运算(+、-、*、/、=)
自增自减运算(前置++、后置++、前置–、后置–)
流运算符(<< 、>>)

C++实现:

1、 main 文件 :存放 main()方法。
2、 ComplexNumber.h 文件 :ComplexNumber类的声明,其公有部分包括构造函数,析构函数,运算符重载函数原型(包括友元函数和成员函数),其私有部分包括两个私有成员 实部(real)和 虚部(imag)。
3、 ComplexNumber.cpp 文件: ComplexNumber类里面函数原型的实现。

实现代码:
1. main文件:

1.1引用ComplexNumber.h
1.2 main 方法

#include"ComplexNumber.h"
void main()
{
	ComplexNumber A, B, C;
	cout << "请输入两个整数,作为第一个复数 A 的实部和虚部:";
	cin >> A;
	cout << "请输入两个整数,作为第二个复数 B 的实部和虚部:";
	cin >> B;
	cout << " A = " << A << endl;
	cout << " B = " << A << endl;
	cout << " A + B = " << A + B << endl;//重载 + 
	cout << " A - B = " << A - B << endl;//重载 - 
	cout << " A * B = " << A * B << endl;//重载 * 
	cout << " A / B = " << A / B << endl;//重载 / 
	cout << " ++ A  = " << ++A << endl;//前置 ++
	cout << " -- A  = " << --A << endl;//前置 --
	cout << " A ++  = " << A++ << endl;//后置 ++
	cout << " A ++  = " << A++ << endl;//后置 ++
	cout << " A --  = " << A-- << endl;//后置 --
	cout << " A --  = " << A-- << endl;//后置 --
	C = A;//重载赋值运算符,等价于 C.operator=(A);
	cout << " C = A  C= " << C << endl;
	C = B;
	cout << " C = B  C= " << C << endl;	
	C += A;
	cout << " C += A  C= " << C << endl;
	C -= B;
	cout << " C -= B  C= " << C << endl;
	C *= A;
	cout << " C *= A  C= " << C << endl;
	C /= B;
	cout << " C /= B  C= " << C << endl;
}
2. ComplexNumber.h 文件

复数类,构造函数、析构函数、运算符重载函数、友元函数的原型,私有成员的声明

#pragma once
#include<iostream>
using namespace std;

class ComplexNumber
{
public:
	ComplexNumber();//构造函数int,int
	~ComplexNumber();//析构函数

	//运算符重载 + - * / =
	ComplexNumber operator +(const ComplexNumber & );//重载 +
	ComplexNumber operator -(const ComplexNumber & );//重载 -
	ComplexNumber operator *(const ComplexNumber & );//重载 *
	ComplexNumber operator /(const ComplexNumber & );//重载 /
	ComplexNumber & operator =(const ComplexNumber & );//重载 =

	//运算符重载 (前置++、后置++、前置--、后置--)
	ComplexNumber & operator ++();//前置++
	ComplexNumber & operator --();//前置--
	ComplexNumber operator ++(int);//后置++
	ComplexNumber operator --(int);//后置--
	
	ComplexNumber & operator +=(const ComplexNumber &);//+=
	ComplexNumber & operator -=(const ComplexNumber &);//-=
	ComplexNumber & operator *=(const ComplexNumber &);//*=
	ComplexNumber & operator /=(const ComplexNumber &);// /=
	
	//运算符重载 流运算符(<< 、>>)
	friend ostream & operator << (ostream & output, ComplexNumber & cn);
	friend istream & operator >> (istream & output, ComplexNumber & cn);

private:
	//real 实部     imag 虚部    
	double real, imag; 
};
3. ComplexNumber.cpp 文件
#include"ComplexNumber.h"
//构造函数
ComplexNumber::ComplexNumber(){}
//析构函数
ComplexNumber::~ComplexNumber(){}
//重载运算符 + 加法:(a + bi) + (c + di) = (a + c) + (b + d)i
ComplexNumber ComplexNumber::operator +(const ComplexNumber & cn)
{
	ComplexNumber cn2;
	cn2.real = this->real + cn.real;//cn.real=A.real+B.real
	cn2.imag = this->imag + cn.imag;
	return cn2;
}
//重载运算符 - 减法:(a+bi)-(c+di)=(a-c)+(b-d)i
ComplexNumber ComplexNumber::operator -(const ComplexNumber & cn)
{
	ComplexNumber cn2;
	cn2.real = real - cn.real;//cn.real=A.real-B.real
	cn2.imag = imag - cn.imag;
	return cn2;
}
//重载运算符 * 乘法:(a+bi)(c+di)=ac+adi+bci+bdi^2 = (ac-bd)+(bc+ad)i
ComplexNumber ComplexNumber::operator *(const ComplexNumber & cn)
{
	ComplexNumber cn2;
	cn2.real = real * cn.real - imag * cn.imag;//ac-bd
	cn2.imag = imag * cn.real + real * cn.imag;//bc+ad
	return cn2;
}
//重载运算符 / 除法:(a+bi)/(c+di)=(ac+bd)/(c^2+d^2) +((bc-ad)/(c^2+d^2))i
/*
1 2 3 4
( 1 + 2i ) / ( 3 + 4i )
= (1*3+2*4)/(3*3+4*4)  + (2*3-1*4)/(3*3+4*4) i
= (  11 / 25  )  +   ( 2 / 25 ) i
= 0.44 +0.08 i
*/
ComplexNumber ComplexNumber::operator /(const ComplexNumber & cn)
{
	ComplexNumber cn2;
	//(ac+bd)/(c^2+d^2)
	cn2.real = (real * cn.real + imag * cn.imag) / (cn.real*cn.real + cn.imag* cn.imag);
	//(bc-ad)/(c2+d2)
	cn2.imag = (imag * cn.real - real * cn.imag) / (cn.real*cn.real + cn.imag* cn.imag);
	return cn2;
}
//重载运算符 = 赋值运算符
ComplexNumber & ComplexNumber::operator =(const ComplexNumber & m)
{
	real = m.real;
	imag = m.imag;
	return *this;
}
//重载运算符 前置++ (a+bi)=(a+bi)+1;
ComplexNumber & ComplexNumber::operator ++()
{
	 ++ real;
	return *this;
}
//重载运算符 前置-- (a+bi)=(a+bi)-1;
ComplexNumber & ComplexNumber::operator --()
{
	-- real;
	return *this;
}
//重载运算符 后置++ (a+bi)=(a+bi);(a+bi)=(a+bi)+1;
ComplexNumber ComplexNumber::operator ++(int)
{
	ComplexNumber cn2;
	cn2.real = real ++;
	cn2.imag = imag;
	return cn2;
}
//重载运算符 后置-- (a+bi)=(a+bi);(a+bi)=(a+bi)-1;
ComplexNumber ComplexNumber::operator --(int)
{
	ComplexNumber cn2;
	cn2.real = real --;
	cn2.imag = imag;
	return cn2;
}
//重载运算符 流运算符 <<
ostream & operator <<(ostream & output, ComplexNumber & cn)
{
	if (cn.imag >= 0)
	{
		output << cn.real << "+" << cn.imag << "i" << endl;
	}
	else
	{
		output << cn.real << cn.imag << "i" << endl;
	}
	return output;
}
//重载运算符 流运算符 >>
istream & operator >> (istream & input, ComplexNumber & cn)
{
	//验证输入
	while (true)
	{
		if (input >> cn.real >> cn.imag)//输入正确
		{
			return  input;
		}
		else
		{
			char c;
			cin.clear();//清除错误标记,重新打开输入流,
						//但是输入流中依旧保留着之前的不匹配的类型
			cin.sync();//清楚cin缓存区的数据。
			cin >> c;
		}
	}
}
ComplexNumber & ComplexNumber::operator +=(const ComplexNumber & cn)
{
	this->real = this->real + cn.real;
	this->imag = this->imag + cn.imag;
	return *this;
}

ComplexNumber & ComplexNumber::operator -=(const ComplexNumber & cn)
{
	real -= cn.real;
	imag -= cn.imag;
	return *this;
}
ComplexNumber & ComplexNumber::operator *=(const ComplexNumber & cn)
{
	real = real * cn.real - imag * cn.imag;;
	imag = imag * cn.real + real * cn.imag;
	return *this;
}
ComplexNumber & ComplexNumber::operator /=(const ComplexNumber & cn)
{
	//(ac+bd)/(c^2+d^2)
	real = (real * cn.real + imag * cn.imag) / (cn.real*cn.real + cn.imag* cn.imag);
	//(bc-ad)/(c2+d2)
	imag = (imag * cn.real - real * cn.imag) / (cn.real*cn.real + cn.imag* cn.imag);
	return *this;
}
4. 运行结果:

在这里插入图片描述
感谢您的浏览。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值