今天答应帮朋友做一个C++题目,颇费了一番周折,终于还是写出来了,让很久没敲代码的我反省了一下,也回忆了以前学过的知识。
题目要求如下:
一、按下列要求编制复数类,并调试通过:
1) 基本的构造函数;
2) 成员运算符+、-实现复数的加减运算;
3) 友元运算符+、-实现更合理的加减运算;
4) 运算符<<和>>实现复数类的输出输入。
多态性:是指同样的消息被不同类型的对象接收时导致不同的行为。
面向对象的多态性分为四类:重载多态,强制多态,包含多态,参数多态。
下面要用到运算符重载多态。
多态性从实现的角度来讲分为两类:
A.编译时的多态:在编译过程中确定了同名操作的具体操作对象。
B.运行时的多态:在程序运行过程中动态的确定操作所针对的具体对象。
而确定操作的具体对象的过程也就是传说中的绑定(联编)。绑定说的通俗一点就是把一个标识符名和一个存储地址联系在一起的过程。
而绑定又分为:静态绑定和动态绑定。
静态绑定:绑定工作在编译连接阶段完成的情况。
动态绑定:绑定工作在运行阶段完成的情况。
下面我们要用到的运算符重载就属于静态绑定。
程序代码如下:
#include<iostream.h>
class Complex
{
public:
Complex(double r=0.0,double i=0.0):real(r),imag(i)
{
cout<<"使用了拷贝构造函数"<<endl;
}
Complex operator+ (const Complex &c2)const; //通过成员函数实现两个复数的加减操作
Complex operator- (const Complex &c2)const;
friend Complex operator+(const Complex &c1,const Complex &c2); //通过友元函数实现两个复数的加减操作
friend Complex operator-(const Complex &c1,const Complex &c2);
friend istream &operator>> (istream &input,Complex &c); //重载输入输出运算符
friend ostream &operator<< (ostream &out,const Complex &c);
private:
double real;
double imag;
} ;
Complex Complex::operator+ (const Complex &c2)const
{
return Complex(this->real+c2.real,this->imag+c2.imag);
}
Complex Complex::operator- (const Complex &c2)const
{
return Complex(this->real-c2.real,this->imag-c2.imag);
}
Complex operator+(const Complex &c1,const Complex &c2)
{
return Complex(c1.real+c2.real,c1.imag+c2.imag);
}
Complex operator-(const Complex &c1,const Complex &c2)
{
return Complex(c1.real-c2.real,c1.imag-c2.imag);
}
istream &operator>> (istream &input,Complex &c)
{
input>>c.real>>c.imag;
return input;
}
ostream &operator<< (ostream &out,const Complex &c)
{
out<<"("<<c.real<<","<<c.imag<<")"<<endl;
return out;
}
int main()
{
Complex c1(5,4),c2,c3;
cin>>c2; //调用输入运算符
cout<<c1<<c2<<c3; //调用重载过后的输出运算符
c3=c1.operator +(c2); //明确调用成员函数
cout<<c3;
c3=operator +(c1,c2); //调用友元函数
cout<<c3;
return 0;
}
程序运行截图如下:
注:本程序是在VC++6.0中编写的,用其他编译器可能需要修改一下头文件,这是VC6.0的一个BUG。