c++运算符重载(常用运算符)知识点

c++运算符重载

先给出一段代码,具体函数内容会在下面给出:

class Person{
public:
    Person(){}
    bool operator==(Person &p);//重载"=="
    bool operator!=(Person &p);//重载"!="
    Person &operator++();//前置++重载
    Person operator++(int);//后置++重载
    friend ostream &operator<<(ostream &out, const Person p);//重载"<<"
    friend istream &operator>>(istream &in, Person &p);//重载">>"
    int get_Age();
private:
    string m_name;
    int m_age;
};

一、基本概念

重载运算符是具有特殊名字的函数。

二、函数名字组成

关键字operator和其后要定义的运算符号共同组成;同样也包含返回类型、参数列表以及函数体。

三、常用运算符重载示例

1.重载输入输出运算符>>、<<

注意事项:

输入输出运算符必须是非成员函数。
输入运算符必须处理输入可能失败的情况。
输入运算符重载函数的参数必须加引用。

"<<"重载:

ostream &operator<<(ostream &out, const Person p){
    out << p.m_age;
    return out;
}

">>"重载:

istream &operator>>(istream &in, Person &p){
    cout << "姓名:";
    in >> p.m_name;
    cout << "年龄:";
    in >> p.m_age;
    return in;
}


2.重载运算符==和!=

"=="重载

bool Person::operator==(Person &p){
    return  this->m_age == p.m_age && this->m_name == p.m_name;
}

"!="重载

bool Person::operator!=(Person &p){
    return  !(this->m_age == p.m_age && this->m_name == p.m_name);
}


3.赋值运算符=重载

注意事项:

赋值运算符必须定义为成员函数。
重载的赋值运算符必须先释放当前内存空间,再创建一片新空间。
Class &Class::operator=(Class &obj)


4. 复合赋值运算符重载

可以是非成员函数也可以是成员函数

Class &Class::operator+=(Class &obj)
...


5.下标运算符[ ]的重载

注意事项:

下标运算符必须是成员函数。
最好同时定义下标运算符的常量版本和非常量版本,当作用域一个常量对象时,下标运算符返回常量引用以确保我们不会给返回的对象赋值。

6.递增和递减运算符重载

注意事项:

应同时定义前置版本和后置版本。
为了区分前置和后置,后置版本接受一个额外的(不被使用)int类型的实参。
前置运算符应该返回递增或递减后对象的引用。
后置运算符应该返回递增或递减后对象的原值。

前置"++"重载

Person &Person::operator++(){
    this->m_age++;
    return *this;
}

后置"++"重载

Person Person::operator++(int){
    Person ret = *this;
    ++m_age;
    return ret;
}

代码测试

#include <iostream>
using namespace std;
#include <string>

class Person{
public:
    Person(){}
    bool operator==(Person &p);
    bool operator!=(Person &p);
    Person &operator++();//前置++重载
    Person operator++(int);//后置++重载
    friend ostream &operator<<(ostream &out, const Person p);
    friend istream &operator>>(istream &in, Person &p);
    int get_Age();
private:
    string m_name;
    int m_age;
};

int Person::get_Age(){
    return m_age;
}

bool Person::operator==(Person &p){
    return  this->m_age == p.m_age && this->m_name == p.m_name;
}

bool Person::operator!=(Person &p){
    return  !(this->m_age == p.m_age && this->m_name == p.m_name);
}



ostream &operator<<(ostream &out, const Person p){
    out << p.m_age;
    return out;
}

istream &operator>>(istream &in, Person &p){
    cout << "姓名:";
    in >> p.m_name;
    cout << "年龄:";
    in >> p.m_age;
    return in;
}

Person &Person::operator++(){
    this->m_age++;
    return *this;
}

Person Person::operator++(int){
    Person ret = *this;
    ++m_age;
    return ret;
}

int main()
{
    Person p1, p2;
    cout << "p1:" << endl;
    cin >> p1;
    cout << "p2:" << endl;
    cin >> p2;
    if(p1 == p2){
        cout << "p1和p2相同" << endl;
    }else{
        cout << "p1和p2不相同" << endl;
    }
    cout << ++(++p1) << endl;
    cout << p2++ << endl;
    cout << p2 << endl;
    return 0;
}
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值