• 运算符重载


    C++中预定义的运算符的操作对象只能是基本的数据类型。但实际上,对于许多用户自己定义的类型(例如类),也需要有类似的操作。这就必须在C++中重新定义这些运算符,赋予已有运算符新的功能,使它能够用于特定类型执行特定的操作。运算符重载的实质是函数的重载,它提供了C++的可扩展性,也是C++最吸引人的地方。

     

    举个例子来说,”+”操作符可以对两个int形数据进行操作,但是无法对两个类进行相加,重载操作符就是重新定义”+”,扩展它的功能,使其满足对其它对象的功能。

     

    运算符重载的一般格式:

     函数类型  operator 运算符名称(形参列表){

    。。。

    函数体部分

    。。。

    }

     

    运算符重载的规则:

    (1) C++不允许用户定义新的运算符,比如“%¥“,它只能对已有的C++运算符进行重载。

    (2) C++不允许重载的运算符目前有5个,分别为

    “.“成员访问操作符;

    “.*”成员指针访问运算符;

    “::”域运算符;

    “sizeof ”:长度运算符;

    “?:“三目操作符”

    (3)不能改变运算符的优先级和结合性;

    (4) 重载运算符的函数不能有默认的参数。否则,就改变了运算符参数的个数不变的规定。

    (5) 重载运算符函数的参数不能全是标准数据类型,以防止用户篡改用于标准类型数据的运算性质,避免混乱。例如

    int operator + (int a,int b)(return a-b);

    (6)运算符重载函数可以是

     

    类的成员函数

    类的友元函数

    普通函数

    下面将对各种重载函数进行说明:

     /////////////////////////////////////////////////////////////////////////////////////////////////////

    A.类的成员函数的重载

    当运算符重载为类的成员函数时,函数的参数比原来的操作数要少一个(后置单目运算符除外),这是因为成员函数用this指针隐式的访问了类的一个对象,它充当了运算符函数最左边的操作数。因此:

    1. 双目运算符重载为类的成员函数时,函数只是显式的说明一个参数,该形参是运算符的右操作数。
    2. 前置单目运算符重载为类的成员函数时,不需要显式的说明参数,即函数没有形参
    3. 后置单目运算符重载为类的成员函数时,函数要带一个整形的形参

    目就是操作数,单目就是一个操作数的操作符,比如正负号,++ --,作用域操作符;双目就是两个操作数的。
    前置自增/自减是先将自身变量改变在参与表达式运算,而且前置运算返回的是左值也就是变量,比如++i = 6,
    而后置的是先用本来的数值参与表达式运算,再改变其自身的值,并且后置运算返回的是右值也就是常量i++ = 6就是错的,这一点很重要,比如
    i = 6;
    cout << i++ << ++i << endl;

    还有一个需要注意的地方就是红色字体标出const不能省去,因为不能对一个引用直接赋为一个左值。

     

     
    #include "stdafx.h"
    
    #include <iostream>
    
    using namespace std;
    
    class complex
    
    {
    
    public:
    
        complex(){}
    
        complex(const int &real,const int &imgc)
    
        {
    
           i=real;
    
           j=imgc;
    
        }
    
        complex operator*(complex &ptr)
    
        {
    
           complex temp;
    
           temp.i=ptr.i+i;
    
           temp.j=ptr.j+j;
    
           cout<<temp.i<<temp.j<<endl;
    
           return temp;
    
        }
    
    private:
    
        int i;
    
        int j;
    
    };
    
     
    
    int _tmain(int argc, _TCHAR* argv[])
    
    {
    
     
    
        complex obj(10,20);
    
        complex cbj(12,-9);
    
        obj.operator *(cbj);
    
        return 0;
    
    }
    

     

     B.类的友元函数的重载

     当运算符重载为类的友元函数时,由于没有隐含的this指针,因此操作数的个数没有发生变化,所有的操作数必须通过函数的形参进行传递,函数的参数与操作数自作向右一一对应。

     

    class complex
    
    {
    
    public:
    
        complex(){}
    
        complex(const int &real,const int &imgc)
    
        {
    
           i=real;
    
           j=imgc;
    
        }
    
        friend complex operator+(complex &qtr,complex &ptr)
    
        {
    
            complex temp;
    
           temp.i=ptr.i+qtr.i;
    
           temp.j=ptr.j+qtr.j;
    
           cout<<temp.i<<temp.j<<endl;
    
           return temp;
    
        }
    
    private:
    
        int i;
    
        int j;
    
    };
    
     
    
     
    
    int _tmain(int argc, _TCHAR* argv[])
    
    {
    
     
    
        complex obj(10,20);
    
        complex cbj(12,-9);
    
        obj+cbj;
    
        return 0;
    
    }

    C.普通非成员函数的重载

    #include <iostream>
    using namespace std;
    class complex
    
    {
    
    public:
    
        complex(){}
    
        complex(const int &real,const int &imgc)
    
        {
    
           i=real;
    
           j=imgc;
    
        }
    
    public:
    
        int i;
    
        int j;
    
    };
    
        complex operator+(complex &qtr,complex &ptr)
    
        {
    
           complex temp;
    
           temp.i=ptr.i+qtr.i;
    
           temp.j=ptr.j+qtr.j;
    
           cout<<temp.i<<temp.j<<endl;
    
           return temp;
    
        }
    
    int _tmain(int argc, _TCHAR* argv[])
    
    {
    
     
    
        complex obj(10,20);
    
        complex cbj(12,-9);
    
        obj+cbj;
    
        return 0;
    
    }
    

    由于我们把ij设为了私有成员,所以该函数的编译时错误的。所以程序中我们重新设置为了公有数据成员。

    另外,介绍一个重载运算符介绍的比较好的网站:

    http://cpp.phy.ccnu.edu.cn/html/kej/program6.html

  • 相关阅读:
    SAP MM 有了采购订单历史的PO行项目里的采购附加费不允许再改了?
    风之语.人在职场也需要'备胎'
    两万字,任正非采访全记录
    SAP 如何得到交货单上的序列号清单?
    【2019年版】如何向SAP公司提交Message?
    工作上996,生活上669,并不是什么难事儿!
    风之语.甲骨文裁员之我见
    天河2号-保持使用yhrun/srun时连接不中断 (screen 命令教程 )
    PXE 和 计算机网络启动
    Gmail 设置,时区
  • 原文地址:https://www.cnblogs.com/CBDoctor/p/2338983.html
Copyright © 2020-2023  润新知