C++——运算符重载(二)

本文详细介绍了使用成员函数和友元函数实现复数加法运算符重载的过程,包括它们的区别与共同点,并通过代码示例进行演示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

友元函数实现复数加法
运算符重载实现思路:成员函数和友元函数,两种区别在于:
1.成员函数具有this指针,友元函数没有
2.传递参数不同,实现代码不同,应用场合也不同
两者相同点是:运算符的使用方法一样

#include <iostream>
using namespace std;

class Complex
{
public:
    Complex()
    {
    }
    Complex(int real,int imag)
    {
        this->real_ = real;
        this->imag_ = imag;
    }
    ~Complex()
    {
        cout << "析构函数" << endl;
    }

    friend Complex operator+(Complex & a, Complex & b)
    {
        Complex res;
        res.real_ = a.real_ + b.real_;
        res.imag_ = a.imag_ + b.imag_;

        return res;
    }

    void printFun()
    {
        cout << "实部是:" << this->real_ << "  " << "虚部是:" << this->imag_ << endl;
    }
private:
    int real_;
    int imag_;
};


void main()
{
    int a = 10, b = 20;
    int c = a + b;
    cout << c << endl;

    Complex c1(10, 20);
    Complex c2(30, 40);
    //Complex c3 = operator+(c1, c2);//实现了复数的加法
    Complex c3 = c1+c2;//友元函数实现运算符重载,其本质是函数
    c3.printFun();  

    cin.get();

}

总结思路:运算符重载函数,根据函数的3要素,推导出函数原型 1.函数名称:operator 运算符() 2.函数参数:一元一个参数,二元二个参数,等等 3.函数返回值:根据业务需要而来

友元函数实现运算符重载
友元函数实现*的demo
1.operator*()
2.operator*(Complex& a,Complex& b);
3.Complex operator*(Complex& a,Complex& b);
4.函数实现
Complex operator*(Complex& a,Complex& b)
{
Complex temp(a.real_ * b.real_,a.imag_ * b.imag_);
return temp;
}
注:这里要想操作类的私有成员变量,需要将此函数变为友元函数,加上关键字friend 即可

成员函数实现运算符重载
1.c1.operator*(c2);//成员函数的调用需要对象,提取出一个参数
2.Complex operator*(Complex &c)
{
Complex temp(this->real_ * c.real_,this->imag_ * c.imag_);
return temp;
}
总结:二元运算符一个参数可以通过this指针隐含实现

一元运算符重载
前置++ 友元函数实现
1.operator++
2.operator++(int right);
3.Complex& operator ++(Complex &right)
{
right.real_++;
right.imag_++;
return right;
}
前置++ 成员函数实现
1.1.operator++
2.obj.operator++();
3.Complex& operator ++()
{
this->real_++;
this->mag_++;
return *this;
}

问题:函数返回值为什么是引用类型?

引用类型可避免调用类的拷贝构造函数,提高程序效率,同时节省内存空间。

后置–友元函数实现
1.operator–(Complex &c);
2.Complex operator–(Complex &c);//先返回再–,所以这里需要临时变量存储–之前的内容
3.friend Complex operator–(Complex &c,int)
{
Complex temp = c;
c.real_–;
c.imag_–;
return temp;
}

注意:前置与后置函数声明完全一样,编译出错。所以从函数重载的角度,给后置函数增加了一个参数int,只是为了区别于前置

后置–成员函数实现
1.operator–;
2.obj.operator–();
3.Complex operator–(int)
{
Complex temp = *this;
this->real_–;
this->imag_–;
return temp;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值