C++中的重载运算符

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

 ❤️‍🔥专栏系列:线性代数C初学者入门训练题解CC的使用文章「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

目录

🐰 运算符的重载

🌸实现对象之间的运算

🌸重载运算符的规则


🐰 运算符的重载

运算符的重载

我们之前学过函数的重载,其实运算符也可以重载。运算符的重载是对已有的运算符重新定义,赋予其另一种功能,以适应不同的数据类型。实际上,我们使用过运算符的重载。例如,我们都已习惯于用加法运算符"+"对整数、单精度数和双精度数进行加法运算,

例如:

#include<iostream>
using namespace std;
int main()
{
    int a=2,b=3,c;
    c=a+b;
    cout<<"c="<<c<<endl;
    float x=3.5,y=6.5,z,t;
    z=x+y;
    cout<<"z="<<z<<endl;
    t=z+c;
    cout<<"t="<<t<<endl;
    return 0;
}
结果为:
c=5
z=10
t=15

为什么同一个运算符"+"可以用于完成不同类型的数据的加法呢?这是因为C++已经对运算符"+"进行了重载,所以加法运算符"+"就适用于整数、单精度数和双精度数数据的加法。在上面程序中,表达式"x+y"对两个单精度数进行加法运算,编译器会“调用”执行单精度数加法的"+"运算符重载函数。而表达式“c+z”对一个整数和一个单精度数进行加法运算,编译器首先“调用”特殊的函数,把整数转化为单精度数,然后“调用”执行单精度数加法"+"运算符重载函数。

🌸实现对象之间的运算

#include<iostream>
using namespace std;
class A
{
public:
    A(int a1=0,int b1=0):a(a1),b(b1)
    {
        ;
    }
    A add(A &ptr)
    {
        return A(a+ptr.a,b+ptr.b);//(1)
        //A c;//(2)
        //c.a=a+ptr.a;
        //c.b=b+ptr.b;
        //return c;
//这两种写法都可以。
    }
    void show()
    {
        cout<<"("<<a<<","<<b<<")"<<endl;
    }
private:
    int a;
    int b;
};
int main()
{
    A a(1,2),b(3,4),c;
    c=a.add(b);
    c.show();
    return 0;

}
结果:
(4,6)

使用成员函数来实现对象a和b的加法运算,如果我们希望能够实现"c=a+b",这就需要用重载运算符"+"来解决

运算符的重载实质上是函数的重载。运算符重载的方法是定义一个重载运算的函数,在实现过程中,编译系统会自动把指定的运算表达式转化为对运算符函数的调用。

重载运算符函数的格式:

函数返回类型 operator 运算符名称(形参列表)
{
    对运算符的重载处理
}

函数名由operater和运算符组成,如“operator +”就是对运算符“+”重载。

例如:

#include<iostream>
using namespace std;
class A
{
public:
    A(int a1=0,int b1=0):a(a1),b(b1)
    {
        ;
    }
    A operator+ (A &ptr)
    {
        return A(a+ptr.a,b+ptr.b);
    }
    void show()
    {
        cout<<"("<<a<<","<<b<<")"<<endl;
    }
private:
    int a;
    int b;
};
int main()
{
    A a(1,2),b(3,4),c;
    c=a+b;//这样我们就对“+”进行重载,更加直接看出c=a+b
    c.show();
    //其实我们还可以像原来一样调用函数,因为函数名由operater和运算符组成,所以等价于c=a+b,但是前者更加直观和方便
    c=a.operator+(b);
    c.show();
    return 0;

}
结果:
(4,6)
(4,6)

🌸重载运算符的规则

(1)C++不允许自己定义新的运算符,只能对C++中已有的运算符进行重载。

(2)运算符重载针对新型数据的实际需要,对原有的运算符进行适当的改造。

(3)C++允许重载的运算符包括C++几乎所有的运算符。

 

在C++中有以下5个运算符不允许被重载:

 

(4)坚持4个“不能改变”。即不能改变运算符操作数的个数;不能改变运算符原有的优先级;不能改变运算符原有的结合性;不能改变运算符原有的语法结构

  单目远算符重载之后只能是单目运算符,双目远算符重载之后仍然是是双目运算符。

  C++语言已经预先规定了每个运算符的优先级,已决定运算次序,不能怎样进行重载,各运算符之间的优先级不会改变。

  C++语言已经预先规定了每个运算符结合性,例如,赋值运算符"="是自右向左的,重载之后仍为自右向左。

(5)重载的运算符必须和自己定义的自定义类型对象一起使用,其参数至少应该有一个是类对象(类对对象的引用)。也就是说参数不能全部是C++的标准类型,以防止自己修改用于标准数据的运算符的性质。

(6)重载运算符的函数不能有带默认值的参数,否则就改变了运算符参数的个数。

(7)用于类对象的运算符一般必须重载,但有两个例外,运算符"="和"&"可以不必自己重载

  赋值运算符"="可以用于每个类对象,可以利用它在同类对象之间的相互赋值。因为系统为每个新申明的类重载了一个赋值运算符,它的作用是逐个复制类对象的数据成员。但如果,类数据成员有动态分配的指针成员,就需要自己重载赋值运算符,否则会导致指针悬挂问题。

🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸   

评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值