zoukankan      html  css  js  c++  java
  • 5.1 C++基本操作符重载

    参考:http://www.weixueyuan.net/view/6379.html

    总结:

      操作符重载指的是将C++提供的操作符进行重新定义,使之满足我们所需要的一些功能。

      长度运算符“sizeof”、条件运算符“:?”成员选择符“.”、对象选择符“.*”和域解析操作符“::”不能被重载。

      调用的语法是C = A.operator+ ( B );,由于operator关键字的作用,operator+这个成员函数也可以通过我们非常熟知的方法调用:C = A + B;

      比较规范的调用方法是C = A.operator+ ( B );,此处是A对象调用该函数,并且函数参数是另一个复数类对象。如此一来,两个操作数分别是A和B。加法操作符二元操作符,但是将其作为成员函数声明时则只需要有一个参数即可,如果重载的操作符是一元操作符,并将其作为类的成员函数,则不需要参数。

      总之,因为它是对象的成员函数。

    操作符重载指的是将C++提供的操作符进行重新定义,使之满足我们所需要的一些功能。

    在C++中可以重载的操作符有:
    +  -  *  /  %  ^  &  |  ~  !  =  <  >  +=  -=  *=  /=  %=  ^=  &=  |= 
    <<  >>  <<=  >>=  ==  !=  <=  >=  &&  ||  ++  --  ,  ->*  ->  ()  [] 
    new  new[]  delete  delete[]

    上述操作符中,[]操作符是下标操作符,()操作符是函数调用操作符。自增自减操作符的前置和后置形式都可以重载。长度运算符“sizeof”、条件运算符“:?”成员选择符“.”、对象选择符“.*”和域解析操作符“::”不能被重载。

    为了介绍基本操作符的重载,我们先来看一个操作符重载的示例。

    例1:
    #include <iostream>
    using namespace std;
    
    class complex
    {
    public:
        complex();
        complex(double a);
        complex(double a, double b);
        complex operator+(const complex & A)const;
        complex operator-(const complex & A)const;
        complex operator*(const complex & A)const;
        complex operator/(const complex & A)const;
        void display()const;
    private:
        double real;   //复数的实部
        double imag;   //复数的虚部
    };
    
    complex::complex()
    {
        real = 0.0;
        imag = 0.0;
    }
    
    complex::complex(double a)
    {
        real = a;
        imag = 0.0;
    }
    
    complex::complex(double a, double b)
    {
        real = a;
        imag = b;
    }
    
    //打印复数
    void complex::display()const
    {
        cout<<real<<" + "<<imag<<" i ";
    }
    
    //重载加法操作符
    complex complex::operator+(const complex & A)const
    {
        complex B;
        B.real = real + A.real;
        B.imag = imag + A.imag;
        return B;
    }
    
    //重载减法操作符
    complex complex::operator-(const complex & A)const
    {
        complex B;
        B.real = real - A.real;
        B.imag = imag - A.imag;
        return B;
    }
    
    //重载乘法操作符
    complex complex::operator*(const complex & A)const
    {
        complex B;
        B.real = real * A.real - imag * A.imag;
        B.imag = imag * A.real + real * A.imag;
        return B;
    }
    
    //重载除法操作符
    complex complex::operator/(const complex & A)const
    {
        complex B;
        double square = A.real * A.real + A.imag * A.imag;
        B.real = (real * A.real + imag * A.imag)/square;
        B.imag = (imag * A.real - real * A.imag)/square;
        return B;
    }
    
    int main()
    {
        complex c1(4.3, -5.8);
        complex c2(8.4, 6.7);
        complex c3;
       
        //复数的加法
        c3 = c1 + c2;
        cout<<"c1 + c2 = ";
        c3.display();
        cout<<endl;
       
        //复数的减法
        c3 = c1 - c2;
        cout<<"c1 - c2 = ";
        c3.display();
        cout<<endl;
       
        //复数的乘法
        c3 = c1 * c2;
        cout<<"c1 * c2 = ";
        c3.display();
        cout<<endl;
       
        //复数的除法
        c3 = c1 / c2;
        cout<<"c1 / c2 = ";
        c3.display();
        cout<<endl;
       
        return 0;
    }

    在这个例子中,我们定义了一个复数类,一个复数包含实部和虚部两部分,我们分别用real和imag来表示复数的实部和虚部,并将这两个变量作为复数类的成员变量,并设置为private属性。在复数类中,我们定义了三个构造函数用于初始化复数类的对象。之后声明了四个操作符重载函数,分别重载加减乘除四种操作符。最后定义了一个打印复数的函数display。

    为了避免大家不熟悉复数的四则运算,在这里将其一一列出,以助于大家对例1的理解。
        ( a + bi ) + ( c + di ) = ( a + c ) + ( b + d )i
        ( a + bi ) – ( c + di ) = ( a – c ) + ( b – d )i
        ( a + bi ) * ( c + di ) = ( ac – bd ) + ( ad + bc )i
        ( a + bi ) / ( c + di ) = ( ac + bd ) / ( c2 + d2 ) + [ ( bc – ad ) / ( c2 + d2 ) ]i

    在例1中我们是将操作符重载函数声明为成员函数,在这个例子中我们首先需要关注的是操作符重载函数的声明。如例中所示,重载加法操作符时,其函数声明为“complex operator+(const complex & A)const;”,两个复数相加,函数返回值为complex类对象,仍然为一个复数。复数相加需要两个复数进行运行,调用函数的类对象本身就是一个复数,因此还需要另外一个复数作为参数,在该函数声明中函数的参数为复数类对象的引用,并且加上了const关键字以确保在函数中不会修改该对象的引用。我们再来看一下加法操作符重载函数的类外定义,在函数体中,我们先定义了一个复数类对象B,之后按照复数的加法运算规则将计算结果赋给B的real 和imag成员变量。由于系统会给类生成一个默认的拷贝构造函数,因此采用传值的形式将计算结果返回没有问题。

    调用操作符重载函数的语法和调用普通成员函数语法相同,例如我们定义三个complex类的对象A、B和C,调用的语法是C = A.operator+ ( B );,由于operator关键字的作用,operator+这个成员函数也可以通过我们非常熟知的方法调用:C = A + B;,采用这种方式调用operator+这个操作符重载函数,意义非常明了,在本例中我们也都是按照这种方式调用的。在本例中我们是将操作符重载函数声明为类的成员函数,在我们进行加法运算时需要两个操作数,也即需要两个复数对象,在声明操作符重载函数时,“complex operator+(const complex & A)const;”确只有一个函数参数,这一点无需奇怪,我们看其调用方式就明白了。比较规范的调用方法是C = A.operator+ ( B );,此处是A对象调用该函数,并且函数参数是另一个复数类对象。如此一来,两个操作数分别是A和B。加法操作符二元操作符,但是将其作为成员函数声明时则只需要有一个参数即可,如果重载的操作符是一元操作符,并将其作为类的成员函数,则不需要参数。

    例2:
    class test
    {
    public:
        test operator!();
    };
    例2中重载的是一元操作符“!”(非),因为是作为成员函数重载的,因此不需要参数。
     
  • 相关阅读:
    币值转换
    抓老鼠啊!亏了还是赚了
    打印沙漏
    秋季学习总结
    记忆中最深刻的三位老师
    自我介绍
    docker 安装redis 和 mysql
    centos 安装docker
    celery的简单使用
    django redis配置和简单使用
  • 原文地址:https://www.cnblogs.com/yongpan/p/7690333.html
Copyright © 2011-2022 走看看