zoukankan      html  css  js  c++  java
  • 运算符重载

    作用:实现自定义类型的运算,类如,struct,class等

    实质:把运算符当作函数去实现另一种功能

    具体实现格式

      返回值类型     opertor 运算符(参数)

      {

        //对复杂操作的打包

      }

    运算符重载的分类

    (1)友元重载:友元函数的形式重载,参数个数 = 操作数

    (2)类重载:类的成员函数重载,参数个数 = 操作数 - 1

      操作数:运算符需要几个数能够使用,例如 + ,需要2个数

    规则和限制

    (1)C++不允许用户自己定义新的运算符,只能对已有的C++运算符进行重载,就是说只能重载内置的 + - * / 等运算符,不能自己创造运算符计算

    (2)C++允许重载的运算符C++中绝大部分的运算符允许重载,不允许重载的有:

        1)成员访问运算符.  

        2)作用域运算符∷

          3)条件运算符?:

        4)成员指针运算符*

        5)编译预处理命令的开始符号#

    3=  ,(),[] ,->这几个运算符只能以类的成员函数去重载,

    (4)单目运算符一般以类的成员函数去重载,双目或双目以上采用友元重载

    (5)重载的参数不能全部是C++内置数据类型。 至少要有一个是自定义类型。因为如果我们定义的是两个内置的类型 就会跟系统所定义的冲突。 因为当我们使用内置的运算符时,那么编译器其实也是调用的一个重载运算符进行计算。这是编译器自动添加的。 如果我们也定义的相同 那么肯定会产生冲突

    总之,当C++语言原有的一个运算符被重载之后,它原先所具有的语义并没有消失,只相当于针对一个特定的类定义了一个新的运算符。

    注意:当重载为类成员函数时,参数个数等于原来的操作数-1 ..比如 对象a +对象b ..我们重载的时候需要两个操作数 a 和b 但我们传递过去一个就可以了 , 比如 a+b 我们只需要把b传递过去就可以了。因为当调用重载运算符时 就是a调用的重载运算符,那么它就是当前对象 它就是这时的this 指针 ..而且类成员函数只能使用两个类中成员...

    例如:

    MyClass.h

    #ifndef _CLASS_TEMPLATE_H_
    #define _CLASS_TEMPLATE_H_
    
    #include<string>
    
    class MyOperator
    {
    public:
        MyOperator();
        MyOperator(int nArr1,int nArr2);
        void Show();
    
        MyOperator operator+(MyOperator myOp);
        MyOperator operator-(MyOperator myOp);
    
    private:
        int mAge;
        int mLength;
    };
    
    #endif

    MyClass.cpp

    #pragma once
    #include "MyClass.h"
    #include<string>
    #include <iostream>
    using namespace std;
    
    MyOperator::MyOperator()
    {
    }
    
    MyOperator::MyOperator(int nArr1, int nArr2)
    {
        this->mAge = nArr1;
        this->mLength = nArr2;
    }
    
    void MyOperator::Show()
    {
        cout << "mAge = " << mAge << endl;
        cout << "mLength = " << mLength << endl;
    }
    
    MyOperator MyOperator:: operator+(MyOperator myOp)
    {
        MyOperator temp;
        temp.mAge = this->mAge + myOp.mAge;
        temp.mLength = this->mLength + myOp.mLength;
        return temp;
    }
    
    MyOperator MyOperator:: operator-(MyOperator myOp)
    {
        MyOperator temp;
        temp.mAge = this->mAge - myOp.mAge;
        temp.mLength = this->mLength - myOp.mLength;
        return temp;
    }

    Main.cpp

    #include<iostream>
    #include "MyClass.h"
    using namespace std;
    
    int main()
    {
        MyOperator temp1(1, 2);
        MyOperator temp2(3, 4);
    
        MyOperator temp3 = temp1 + temp2;
        temp3.Show();
    
    
        system("pause");
        return 0;
    }
    111
  • 相关阅读:
    hdu 1372 Knight Moves
    hdu 1253 胜利大逃亡
    nyoj 737 石子合并 经典区间 dp
    nyoj 737 石子合并 http://blog.csdn.net/wangdan11111/article/details/45032519
    nyoj 55 懒省事的小明
    C++ STL priority_queue
    Code forces363D Renting Bikes
    性能测试分享:jmeter性能监控(一)
    性能测试培训:WebSocket协议的接口性能之Jmeter
    翻译一篇文章:It's Difficult to Grow a Test Developer(成为测试开发工程师的艰辛)
  • 原文地址:https://www.cnblogs.com/zwj-199306231519/p/12996610.html
Copyright © 2011-2022 走看看