• C++ 运算符重载(operator overloading)


    运算符重载是通过函数实现的,它本质上是函数重载。

    运算符重载其实就是定义一个函数,在函数内实现想要的功能,当用到这个运算符时,编译器会自动调用这个函数。

    #include <iostream>
    using namespace std;
    class complex{
    public:
        complex();
        complex(double real, double imag);
    public:
        //声明运算符重载
        complex operator+(const complex &A) const;
        void display() const;
    private:
        double m_real;  //实部
        double m_imag;  //虚部
    };
    complex::complex(): m_real(0.0), m_imag(0.0){ }
    complex::complex(double real, double imag): m_real(real), m_imag(imag){ }
    //实现运算符重载
    complex complex::operator+(const complex &A) const{
        complex B;
        B.m_real = this->m_real + A.m_real;
        B.m_imag = this->m_imag + A.m_imag;
        return B;
    }
    void complex::display() const{
        cout<<m_real<<" + "<<m_imag<<"i"<<endl;
    }
    int main(){
        complex c1(4.3, 5.8);
        complex c2(2.4, 3.7);
        complex c3;
        c3 = c1 + c2;
        c3.display();
        return 0;
    }
    

    可以将operator运算符名称这一部分看作函数名,例如operator+

    在全局范围内重载运算符

    运算符重载函数不仅可以作为类的成员函数,还可以作为全局函数。

    运算符重载函数不是 complex 类的成员函数,但是却用到了 complex 类的 private 成员变量,所以必须在 complex 类中将该函数声明为友元函数。

    #include <iostream>
    using namespace std;
    class complex{
    public:
        complex();
        complex(double real, double imag);
    public:
        void display() const;
        //声明为友元函数
        friend complex operator+(const complex &A, const complex &B);
    private:
        double m_real;
        double m_imag;
    };
    complex operator+(const complex &A, const complex &B);
    complex::complex(): m_real(0.0), m_imag(0.0){ }
    complex::complex(double real, double imag): m_real(real), m_imag(imag){ }
    void complex::display() const{
        cout<<m_real<<" + "<<m_imag<<"i"<<endl;
    }
    //在全局范围内重载+
    complex operator+(const complex &A, const complex &B){
        complex C;
        C.m_real = A.m_real + B.m_real;
        C.m_imag = A.m_imag + B.m_imag;
        return C;
    }
    int main(){
        complex c1(4.3, 5.8);
        complex c2(2.4, 3.7);
        complex c3;
        c3 = c1 + c2;
        c3.display();
        return 0;
    }
    

    运算符重载时要遵循的规则

    1.并不是所有的运算符都可以重载。长度运算符sizeof、条件运算符:?、成员选择符.和域解析运算符::不能被重载。

    2.重载不能改变运算符的优先级和结合性。

    3.重载不能改变运算符的用法,原来有几个操作数、操作数在左边还是在右边,这些都不会改变。

    4.运算符重载函数不能有默认的参数;否则就改变了运算符操作数的个数,这显然是错误的。

    5.运算符重载函数既可以作为类的成员函数,也可以作为全局函数。

    6.箭头运算符->、下标运算符[]、函数调用运算符()、赋值运算符=只能以成员函数的形式重载。

  • 相关阅读:
    面向对象的三个特征:封装(抽象)、继承、多态
    java中流程控制有4种循环,各自的适用场景
    break 和 continue
    基础知识点总结及示例
    Java程序的运行过程,以及Java为什么能够跨平台
    JDK,JRE,JVM的区别与联系?
    jsp(二)
    JSP
    过滤器
    Servlet监听器(二)
  • 原文地址:https://www.cnblogs.com/xiaobaizzz/p/12355294.html
Copyright © 2020-2023  润新知