运算符重载

一、运算符重载的概念

1. 什么是运算符重载:

1)重载,重新载入,就比如函数重载,对一个已有的函数赋值一个新的定义。因此同一个名字就可以有不同的含义

2)运算符也是可以重载的,不如cout在输出一个变量的时候,就接受不同类型的数据并输出,它就是重载了'<<'运算符,这个就是运算符重载

3)所以运算符指的是对已有的运算符重新定义新的运算规则,已适应不同的数据类型,当然重载之后,之前的运算规则还是有的

2. 为什么要进行运算符重载

运算符重载之后可以让运算符去适应不同的数据类型,对于基本数据类型,系统给出了运算符的操作规则,对于自定义数据类型来说,系统是不知道给出什么规则的

示例

class student
{
    int id;
    int age;
    char name[20];
public:
    student(int id, int age, const char *name)
    {
        this->id = id;
        this->age = age;
        strcpy(this->name, name);
    }
}
student stu1 (1,23,"李四");
student stu2 (4,56,"王五");
//stu1 + stu2;    //错误:编译器不知道这样相加加的是什么

二、运算符重载

1. 运算符重载类中的定义

1)关键字:operator(通过关键字来定义运算符重载)

2)定义:

        函数返回值类型 operator 要重载的运算符(参数列表)

        {

                函数体;

        }

示例

int operator+(const student & stu)
{
    return this->age+stu.age;
}
//注意:因为我们这个运算符是在类中写的,
//所以是通过对象调用的,那么this指针会占一个参数,
//而且是第一个参数,也就是说如果我们重载一个运算符,
//是在类中,而这个运算符是个单目运算符,那么参数列表就不用写东西了,
//是双目,那么就需要传另一个参数进来

2. 运算符重载的特点

1)几乎所有的运算符都可以被重载

2)运算符重载基本出现在中和结构体

3) 运算符可以理解为函数的一个表现

3. 运算符重载的注意事项

1)重载运算符,这个重载的运算符还是满足原来的规则,不能说重载+,结果做的是-的事,这样会使在运算符重载的运用上增加很大的难度

2)运算符重载的参数,类中重载调用对象会占一个参数,就是this会占一个参,参数列表就是用来表示运算符的操作数的

3)对于运算符重载的调用,可以直接使用运算符,也可以通过对象,出来调用

4)考虑返回值,不同的运算符有不同的返回值,要记得满足运算符原来的规划

三、使用友元函数,实现运算符重载

类在已经实现且部分修改的情况下,需要进行运算符重载,就可以通过友元的方式来进行重载

示例

int operator+(const student& stu1,const student& stu2)
{
    return stu1.id+stu2.id;
}
//因为这个是直接访问的私有成员,所以需要在类中声明一句

friend int operator+(const student& stu1,const student& stu2);
//使用可以,直接stu1+stu2; ==>operator+(stu1,stu2);

四、两个不能在类中重载的运算符

示例

class node
{
    int val;
public:
    node(){val = 10;}
    friend istream& operator>>(istream& is, node& n);//输入
    friend istream& operator<<(ostream& os, node& n);//输出

    //前后++
    node& operator++()      //前++
    {
        this->val++;
        return *this;
    }
    node operator++(int)    //后++
    {
        node temp =* this;  //保存val的值
        this->val++;        //val++
        return *this;       //返回的是没有++的val的值
    }
    //这里int是占位参,不用传参,只是用来区分前后++的

    //---伪代码---//
    void operator()()
    {
        cout<<"我是一个函数!!"<<endl;
    }
};
friend istream& operator>>(istream& is, node& n)
{
    is>>n.val;
    return is;
}
friend istream& operator>>(ostream& os, node& n)
{
    os<<n.val;
    return os;
}

node n;
cin>>n;    //对对象里面的val赋值
cout<<n;   //输出对象里面的val值
n();       //输出:我是一个函数!!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你怎么知道我头发乌黑浓密

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值