一、基本使用方法
重载操作符本质上是一个特殊的函数,函数名是operator后接要重载的操作符
参数要根据操作符的使用规则来,要和原来的数量、顺序、类型保持一致
一般要有返回类型,为了和后续操作符继续操作
告诉编译器,遇到该操作符时,应当调用该函数,是对原来操作符的一个扩展和补充
#include<iostream>
using namespace std;
class CTest{
public:
int m_a;
CTest()
{
m_a=20;
}
int operator+(/*const CTest *this*/int a)
{
return this->m_a+a;
}
int operator+=(/*const CTest *this*/int a)
{
return this->m_a+=a;
}
int operator=(/*const CTest *this*/int a)
{
return this->m_a=a;
}
//----------------------------------------
int operator++()//左++
{
return ++m_a;
}
int operator++(int)//右++,int没有实际的作用,就是为了和左++区分开来
{
return m_a++;
}
};
int main()
{
int a=10;
CTest tst;
int b;
b=tst+a;
cout<<b<<endl;
tst+=10;
cout<<tst.m_a<<endl;
CTest tst2;
tst2=tst+10;
cout<<tst2.m_a<<endl;
//------------------
CTest tst3;
int c=0;
c=++tst3;
cout<<c<<" "<<tst3.m_a<<endl;//21 21
c=tst3++;
cout<<c<<" "<<tst3.m_a<<endl;//21 22
return 0;
}
二、类外重载操作符
int operator+(int a,CTest tst)//不能和类内的相同,会产生歧义
{
return tst.m_a+a;
}
ostream& operator<<(ostream &os,CTest &tst)
{
os<<tst.m_a;
return os;
}
istream& operator>>(istream &is,CTest &tst)
{
is>>tst.m_a;
return is;
}
输入输出操作符通常在类外重载
其中形参是结构体或类的时候,要用引用,避免浅拷贝问题
类内和类外重载操作符的区别:
1.类内:作为类成员函数,有一个默认的this指针作为第一个参数,省略了一个参数,类对象匹配this
2.类外:作为全局的重载操作符函数,相比于类内少了一个默认的this指针参数,所以需要比类内多一个参数,且参数的顺序不需要固定了,可以进行调整,但是注意不能和类内的重复,避免产生歧义。
在类外重载操作符,必须至少含有一个结构体或类等自定义类型的参数
三、重载操作符使用时的注意事项
1.重载操作符不能改变操作符原来的使用规则,原来有几个操作数,现在就应该有几个,原来在左边,现在依旧应该在左边
2.重载操作符函数不允许有默认值,否则改变了操作符的用法
3.重载操作符不允许改变原来的优先级和结合性
4.= [ ] () ->只能在类内重载
5.sizeof ?: . .* :: 不能重载
6.对于同一个操作符来说,参数不同可能含义不同
四、对象类型转换
重载某个类型,定义该类对象就可以像这个类型的变量一样去使用
类型转换函数 operator后加类型 无参数 无返回值
//类内
operator int()
{
return m_a
}
相对于重载操作符函数来说,重载操作符函数的优先级更高