作用:实现自定义类型的运算,类如,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; }