C++ 运算符重载详解【建议收藏】

举报
Linux猿 发表于 2021/09/30 17:37:01 2021/09/30
【摘要】 C++ 运算符重载详解

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


这篇文章对运算符的重载进行简单的总结。

1. 概念:运算符重载的本质是函数重载。

2. 格式:

返回类型 operator 运算符名称(形参列表)
{
    重载实体;
}

可以把上面的 [ operator 运算符名称 ] 看作新的函数名。

3. 规则:

  • C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载;
  • C++允许重载的运算符,C++中绝大部分运算符都是可以被重载的;

运算符重载1.png

运算符重载2.png

重载不能改变运算符运算对象(即操作数)的个数;如,关系运算符“>”和“<”等是双目运算符,重载后仍为双目运算符,需要两个参数。运算符”+“,”-“,”*“,”&“等既可以作为单目运算符,也可以作为双目运算符,可以分别将它们重载为单目运算符或双目运算符。

重载不能改变运算符的优先级别;

重载不能改变运算符的结合性。如,复制运算符”=“是右结合性(自右至左),重载后仍为右结合性;

重载运算符的函数不能有默认的参数;

重载运算符的运算中至少有一个操作数是自定义类;

不必重载的运算符(= &);

对运算符的重载,不应该失去其原有的意义;

4. 友元重载和成员重载

    大多数运算符既可以友元重载也可以成员重载,

4.1 单目运算符重载

格式:

    全局函数:operator#(M);

    成员函数:M.operator#()

4.1.1 -(负数)运算符重载(+正数类似)

#include <iostream>
using namespace std;
class Complex{
public:
    Complex(float x=0, float y=0):_x(x),_y(y) {}
    void dis()
    {
        cout<<"("<<_x<<","<<_y<<")"<<endl;
    }
    const Complex operator-() const
    {
        return Complex(-_x,-_y);
    }
private:
    float _x;
    float _y;
};
int main()
{
    int n = 10;
    //作对比
    cout<<"n = "<<n<<endl;
    cout<<"-n = "<<-n<<endl;
    cout<<"-(-n) = "<<-(-n)<<endl;
    //-n = 10;    error
    Complex c(1,2);
    c.dis();
    Complex c2 = -c;
    c2.dis();
    c2 = -(-c);
    c2.dis();
    return 0;
}

如上述代码所示,返回值必须为const Complex,而且函数体为const类型,不能对成员变量进行更改。

4.1.2 ++运算符重载(前++,前--类似)

#include <iostream>
using namespace std;
class Complex{
public:
    Complex(float x=0, float y=0):_x(x),_y(y) {}
    void dis(){
        cout<<"("<<_x<<","<<_y<<")"<<endl;
    }
    Complex & operator++(void){
        _x++;
        _y++;
        return *this;
    }
private:
    float _x;
    float _y;
};
int main()
{
    //作对比
    int n = 10;
    cout<<"n = "<<n<<endl;
    cout<<"++n = "<<++n<<endl;
    cout<<"n = "<<n<<endl;
    cout<<"++++n = "<<++++n<<endl;
    cout<<"n = "<<n<<endl;
    (++n) = 99;
    cout<<n<<endl;
    Complex c(10,10);
    c.dis();
    Complex c2=++c;
    c2.dis();
    c.dis();
    c2 = ++++c;
    c2.dis();
    c.dis();
    (++c) = Complex(99, 99);
    c.dis();
    return 0;
}

输出结果:

运算符重载3.png

4.1.3 ++运算符重载(后++,后--类似)

#include <iostream>
using namespace std;
class Complex{
public:
    Complex(float x=0, float y=0):_x(x),_y(y) {}
    void dis(){
        cout<<"("<<_x<<","<<_y<<")"<<endl;
    }
    const Complex operator++(int){//参数int用于区分前++和后++
        Complex t = *this;
        _x++;
        _y++;
        return t;
    }
private:
    float _x;
    float _y;
};
int main()
{
    //作对比
    int n = 10;
    cout<<n<<endl;
    cout<<n++<<endl;
    cout<<n<<endl;
    //cout<<n++++<<endl; //13 后++表达式不能连用
 
    Complex c(10,10);
    c.dis();
    Complex c2 = c++;
    c2.dis();
    c.dis();;
    //c2 = c++++;      error
    // c2.dis();
    return 0;
}

输出结果:

运算符重载4.png

4.2 双目运算符重载

格式:

    全局函数:operator#(L, R);

    成员函数:L.operator#(R)

4.2.1 +=运算符重载(-= 也一样)

#include <iostream>
using namespace std;
class Complex{
public:
    Complex(float x=0, float y=0):_x(x),_y(y) {}
    void dis()
    {
        cout<<"("<<_x<<","<<_y<<")"<<endl;
    }
    Complex& operator+=(const Complex &c)
    {
        this->_x += c._x;
        this->_y += c._y;
        return *this;
    }
private:
    float _x;
    float _y;
};
int main(){
    int a = 10, b = 20,c = 30;
    (a += b) += c;            //作对比
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    cout<<"c = "<<c<<endl;
    Complex a1(10, 10);
    Complex b1(20, 20);
    Complex c1(30, 30);
    (a1 += b1) += c1;
    a1.dis();
    b1.dis();
    c1.dis();
    return 0;
}

输出结果:

运算符重载5.png

如上述代码所示,与类对象的内置类型作了对比。返回引用的原因:返回的操作数还要作为左值进行操作。

4.2.2 +运算符重载(-运算符类似)

#include <iostream>
using namespace std;
 
class Complex{
public:
    Complex(float x=0, float y=0):_x(x),_y(y) {}
    void dis(){
        cout<<"("<<_x<<","<<_y<<")"<<endl;
    }
    const Complex operator+(const Complex &another);
private:
    float _x;
    float _y;
};
const Complex Complex::operator+(const Complex & another){
    return Complex(this->_x + another._x,this->_y + another._y);
}
int main()
{
    //作对比
    int a = 3;
    int b = 4;
    cout<<"a = "<<a<<endl;
    cout<<"b = "<<b<<endl;
    int c = a + b;
    cout<<"c = "<<c<<endl;
    //(a+b) = 10;       error
 
    Complex c1(3,3);
    Complex c2(4,4);
    c1.dis();
    c2.dis();
    Complex c3 = c1+c2;
    c3.dis();
    return 0;
}

输出结果:

运算符重载6.png

友元函数的实现代码:链接~

上面只是简单的列举几个作为例子,String GitHub链接 是本人写的一个String的实现。


🎈 有任何疑问欢迎交流!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。