C++类和对象(八)

day08

2023年3月12日

知识点1.运算符重载

运算符重载就是对已有的运算符重新定义,赋予其另一种功能,以适应不同的数据类型;

语法:函数名由关键字operator和运算符组成;

注意:重载运算符不要更改运算的本质操作,比如+是数据相加,不要重载为相减;

1、重载<<运算符

#include <iostream>
#include <cstring>

using namespace std;

class Student{
    //作为类的友元函数
    friend ostream& operator<<(ostream &out, Student &stu);
private:
    char* name;//姓名
    int num;//学号
public:
    Student(const char* name, int num)
    {
        this->name = new char[strlen(name) + 1];
        strcpy(this->name, name);
        this->num = num;
    }
    void showStudent()
    {
        cout << "姓名:" << this->name << endl;
        cout << "学号:" << this->num << endl;
    }
    ~Student()
    {
        if (this->name != NULL)
        {
            delete [] this->name;
            this->name = NULL;
        }
    }
};

//重载<<运算符,直接输出对象信息
ostream& operator<<(ostream& out, Student& stu)
{
    out << "姓名:" << stu.name << endl;
    out << "学号:" << stu.num << endl;
    return out;
}


int main()
{
    Student stu1("lucy", 1234);
    stu1.showStudent();
    cout << "-------------" << endl;

    //重载<<运算符调用方式1
    operator<< (cout, stu1);
    cout << "-------------" << endl;

    //重载<<运算符调用方式2
    //去掉operator,第一个参数放在<<运算符左边,第二个参数放在<<运算符右边
    cout << stu1;
    cout << "-------------" << endl;

    //重载<<运算符迭代调用
    Student stu2("bob", 1235);
    cout << stu1 << stu2;

    return 0;
}

结果:

2、成员函数重载加法运算符

#include <iostream>

using namespace std;

class Data{
private:
    int num1;
    int num2;
public:
    Data(){}
    Data(int num1, int num2)
    {
        this->num1 = num1;
        this->num2 = num2;
    }
    //成员函数实现加法运算符重载
    Data operator+(Data& ob)
    {
        int tem_num1 = this->num1 + ob.num1;
        int tem_num2 = this->num2 + ob.num2;
        Data tem(tem_num1, tem_num2);
        return tem;
    }
    //显示类中信息
    void showData()
    {
        cout << "num1 = " << this->num1 << endl;
        cout << "num2 = " << this->num2 << endl;
    }
    ~Data(){}
};

int main()
{
    Data ob1(10, 20);
    cout << "实例化对象ob1中信息:" << endl;
    ob1.showData();
    Data ob2(30, 40);
    cout << "实例化对象ob2中信息:" << endl;
    ob2.showData();

    //成员函数实现加法运算符重载调用方式1
    cout << "实例化对象ob1 + ob2中信息:" << endl;
    ob1.operator+(ob2).showData();

    //成员函数实现加法运算符重载调用方式2
    cout << "实例化对象ob1 + ob2中信息:" << endl;
    (ob1 + ob2).showData();

    return 0;
}

结果:

3、可重载的运算符:

不可重载的运算符:

重载运算符时不能改变运算符的优先级,不能改变运算符的参数个数。

4、自增自减(++、--)运算符重载

前置++,调用operator++(a);后置++,调用operator++(a,int);(自减相同)

#include <iostream>

using namespace std;

class Data{
    //类的友元
    friend ostream& operator<<(ostream& out, Data& ob);
private:
    int a;
    int b;
public:
    Data(){ a = 0, b = 0; }
    Data(int a, int b) : a(a), b(b){}
    //前置++重载,++ob,先加后使用
    Data& operator++()
    {
        a ++, b ++;
        return *this;
    }
    //后置++重载,ob++,先使用后加
    //int为占位符,区分前置++和后置++
    Data& operator++(int)
    {
        static Data old = *this;
        a ++, b ++;
        return old;
    }
    //前置--重载,--ob,先减后使用
    Data& operator--()
    {
        a --, b --;
        return *this;
    }
    //后置--重载,ob--,先使用后减
    Data& operator--(int)
    {
        static Data old = *this;
        a --, b --;
        return old;
    }
    ~Data(){}
};

//重载<<运算符
ostream& operator<<(ostream& out, Data& ob)
{
    out << "a = " << ob.a << ",b = " << ob.b;
    return out;
}

int main()
{
    Data ob1(10, 20);

    cout << "使用重载<<运算符:" << endl;
    cout << ob1 << endl;
    cout << "------------------" << endl;

    cout << "使用重载的前置++" << endl;
    cout << ++ ob1 << endl;
    cout << "------------------" << endl;

    cout << "使用重载的后置++" << endl;
    cout << ob1 ++ << endl;
    cout << ob1 << endl;
    cout << "------------------" << endl;

    cout << "使用重载的前置--" << endl;
    cout << -- ob1 << endl;
    cout << "------------------" << endl;

    cout << "使用重载的后置--" << endl;
    cout << ob1 -- << endl;
    cout << ob1 << endl;
    cout << "------------------" << endl;

    return 0;
}

结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值