第7周项目2-实现复数类中的运算符重载(1、成员函数)

本文详细介绍了如何使用类的成员函数实现复数的加减乘除运算符重载,通过实例展示了复数类的定义及运算符重载方法,并提供了测试代码以验证其实现效果。
/*  
*copyright (c)2015,烟台大学计算机学院  
*All rights reserved  
*文件名称:project.cpp  
*作者:孙春红  
*完成日期:2015年4月23日  
*版本号:v1.0  
*  
*问题描述:请用类的成员函数,定义复数类重载运算符+、-、*、/,使之能用于复数的加减乘除
*输入描述:略。  
*程序输出:略。  
*/  
#include<iostream>
using namespace std;
class Complex
{
public:
    Complex()
    {
        real=0;
        imag=0;
    }
    Complex(double r,double i)
    {
        real=r;
        imag=i;
    }
    Complex operator+(const Complex &c2);
    Complex operator-(const Complex &c2);
    Complex operator*(const Complex &c2);
    Complex operator/(const Complex &c2);
    void display();
private:
    double real;
    double imag;
};
//下面定义成员函数
Complex Complex::operator +(const Complex &c2)
{
    Complex c;
    c.real=real+c2.real;
    c.imag=imag+c2.imag;
    return c;
}
Complex Complex::operator -(const Complex &c2)
{
    Complex c;
    c.real=real-c2.real;
    c.imag=imag-c2.imag;
    return c;
}
Complex Complex::operator *(const Complex &c2)
{
    Complex c;
    c.real=real*c2.real-imag*c2.imag;
    c.imag=real*c2.imag+imag*c2.real;
    return c;
}
Complex Complex::operator /(const Complex &c2)
{
    Complex c;
    c.real=(real*c2.real+imag*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
    c.imag=(imag*c2.real-real*c2.imag)/(c2.real*c2.real+c2.imag*c2.imag);
    return c ;
}
void Complex::display()
{
    cout<<"("<<real<<","<<imag<<"i)"<<endl;
}
//下面定义用于测试的main()函数
int main()
{
    Complex c1(3,4),c2(5,-10),c3;
    cout<<"c1=";
    c1.display();
    cout<<"c2=";
    c2.display();
    c3=c1+c2;
    cout<<"c1+c2=";
    c3.display();
    c3=c1-c2;
    cout<<"c1-c2=";
    c3.display();
    c3=c1*c2;
    cout<<"c1*c2=";
    c3.display();
    c3=c1/c2;
    cout<<"c1/c2=";
    c3.display();
    return 0;
}


运行结果:

知识点总结:

学会运用成员函数对运算符重载。

张天乐 gold94182 C++ 面向对象 - 运算符重载与友元函数(实验) 实验总用时:00:00:07 nav 第1关:复数运算 100 学习内容 参考答案 记录 评论 任务描述 相关知识 运算符重载 运算符重载之外部函数 运算符重载成员函数 编程要求 测试说明 任务描述 本关任务:设计一个复数类实现复数的三种运算。 相关知识 所谓重载,就是赋予新的含义。函数重载可以让一个函数名有多种功能,在不同情况下进行不同的操作。运算符重载也是一个道理,同一个运算符可以有不同的功能。本关我们就一起来学习运算符重载使用运算符重载 运算符重载方法是定义一个重载运算符的函数,在需要执行被重载运算符时,系统就自动调用该函数,以实现相应的运算。也就是说,运算符重载是通过定义函数实现的。运算符重载实质上是函数的重载重载运算符声明方式如普通成员函数一样,只不过他的名字包含关键字 operator,以及紧跟其后的一个 C++ 预定义的操作符。格式如下: 函数类型 operator 运算符名称 (形参表列) { // 对运算符重载处理 } 例如: class Test{ /* 类声明 */ }; Test operator+(Test t1,Test t2); // 重载 + 运算符,这个运算符要求两个操作数 并不是所有 C++ 中的运算符都可以支持重载,我们也不能创建一个新的运算符出来并且不能改变运算符操作对象的个数。有的运算符只能作为类成员函数重载,而有的运算符则只能当作普通函数来使用: 不能被重载运算符有:. 、.* 、:: 、?: 、sizeof 只能作为类成员函数重载运算符有:() 、[] 、-> 、= 运算符重载有两种方式: 使用外部函数进行运算符重载使用成员函数进行运算符重载运算符重载之外部函数 要调用运算符重载函数,有两种方法,一种是通过函数名调用,即operator+(t1,t2),另一种是在使用运算符的时候自动调用,这里介绍第二种。 就如同函数重载的最佳匹配规则,使用一个运算符时,会寻找名为operator<运算符>,且与当前操作数最佳匹配的那个重载版本进行调用。 例如: class Test{ /* 类声明 */ }; class D : public Test {}; //创建一个 Test 类的子类 //外部函数 Test operator+(Test t1,Test t2){ /* 一些操作 */ } int main() { Test t1,t2; Test t3 = t1 + t2; // 最佳匹配是 operator+(Test,Test) D d1,d2; D d3 = d1 + d2; // 最佳匹配也是 operator+(Test,Test) } 至于运算符重载函数内部怎么实现(定义),那就可以根据需求来了,例如: class Test { public: int a; }; Test operator+(Test &t1,Test &t2) { // 重载加法运算符,实际对 Test 类中的 a 成员变量进行加法运算 Test t; t.a = t1.a + t2.a; return t; } int main() { Test t1,t2; t1.a = 10; t2.a = 20; cout << (t1 + t2).a <<endl; // 调用 operator(Test&,Test&)重载版本 } 输出结果为:30 注意:在运算符重载函数中也是要考虑类成员访问性的问题的。 运算符重载成员函数 运算符重载的函数也可以写到某个类中成为一个成员函数,格式与写在外面没有区别,但在参数列表上有一些差异。 成为成员函数运算符重载函数的参数需要少写一个最左边的参数,而少的这个参数就由当前的对象代替。 例如: class Test { public: int a; Test operator+(Test& t2); // 少了左边的一个参数 }; Test Test::operator+(Test &t2) { Test t; t.a = a + t2.a; // 当前对象代替了原本的第一个参数 return t; } int main() { Test t1,t2; t1.a = 10; t2.a = 20; cout << (t1 + t2).a << endl;
最新发布
11-01
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值