运算符重载

作用:实现自定义类型的运算,类如,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
原文地址:https://www.cnblogs.com/zwj-199306231519/p/12996610.html