zoukankan      html  css  js  c++  java
  • C++中预定义的运算符的操作对象只能是基本的数据类型

    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;



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





  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/fireae/p/3685542.html
Copyright © 2011-2022 走看看