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;
}
2. ComplexNumber.h 文件
复数类,构造函数、析构函数、运算符重载函数、友元函数的原型,私有成员的声明
#pragma once
#include<iostream>
using namespace std;
class ComplexNumber
{
public:
ComplexNumber();//构造函数int,int
~ComplexNumber();//析构函数
//运算符重载 + - * / =
ComplexNumber operator +(ComplexNumber);//重载 +
ComplexNumber operator -(ComplexNumber);//重载 -
ComplexNumber operator *(ComplexNumber);//重载 *
ComplexNumber operator /(ComplexNumber);//重载 /
ComplexNumber operator =(ComplexNumber);//重载 =
//运算符重载 (前置++、后置++、前置--、后置--)
ComplexNumber operator ++();//前置++
ComplexNumber operator --();//前置--
ComplexNumber operator ++(int);//后置++
ComplexNumber operator --(int);//后置--
ComplexNumber operator +=(ComplexNumber);//+=
ComplexNumber operator -=(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 +(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 -(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 *(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 /(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 =(ComplexNumber m)
{
real = m.real;
imag = m.imag;
return *this;
}
//重载运算符 前置++ (a+bi)=(a+bi)+1;
ComplexNumber ComplexNumber::operator ++()
{
ComplexNumber cn2;
cn2.real = ++ real;
cn2.imag = imag;
return cn2;
}
//重载运算符 前置-- (a+bi)=(a+bi)-1;
ComplexNumber ComplexNumber::operator --()
{
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;
}
//重载运算符 后置-- (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;
}
}
}
4. 运行结果:
感谢您的浏览。