加号运算符重载
作用:实现两个自定义类型数据的相加
对于内置的数据类型的表达式的运算符是不可以改变的
class Person
{
public:
int a;
int b;
//1. 成员函数重载
Person operator+(Person &p){//operator+是通用的
Person tmp;
tmp.a=this->a+p.a;
tmp.b=this->b+p.b;
return tmp;
}
}
//2. 全局函数重载+
Person operator+(Person& p1,Person& p2){
Person tmp;
tmp.a=p1.a+p2.a;
tmp.b=p1.b+p2.b;
return tmp;
}
void test(){
Person p1;
p1.a=10;
p1.b=10;
Person p2;
p2.a=20;
p2.b=20;
Person p3;
p3=p1+p2;
}
左移运算符重载
class Person{
public:
int a;
int b;
//一般不利用成员函数重载<<,因为无法实现cout在左侧
void operator<<(cout){}
};
ostream operator<<(ostream &out,Person p)//本质运算为<<(cout,p),简化为cout<<p
{
out<<p.a<<" "<<p.b;
return cout;//为了链式编程
//也可return out;
}
int main(){
Person p;
cout<<p<<endl;
}
递增运算符重载
class myInt{
myInt(){
myNum=0;
}
friend ostream& operator<<(ostream& out,myInt myint);
//重载++运算符:前置
//返回引用是为了一直对同一个数据进行操作
myInt& operator++()
{
myNum++;
return *this;
}
//int表示占位参数,用于区分前置和后置递增
myInt operator++(int)
{
myInt tmp=*this;//先记录结果
myNum++;
return tmp;
}
//后置递增返回的是值,因为tmp是局部变量,返回局部变量会出错
private:
int myNum;
};
ostream& operator<<(ostream& out,myInt myint){
out<<myint<<endl;
return out;
}
int main()
{
myInt myint;
cout<<++(++myint);
cout<<myint++;
}
赋值运算符重载
C++编译器会默认给类添加赋值运算符operator+,对属性进行值拷贝
class Person{
public:
Person(int age){
mAge=new int(age);
}
~Person()
{
if(mAge!=NULL){
delete mAge;
mAge=NULL;
}
}
//重载=
Person& operator=(Person &p){
//先判断是否有属性在堆区,如果有先释放干净,再深拷贝
if(mAge!=NULL){
delete mAge;
mAge=NULL;
}
mAge=new int(*p.mAge);
return *this;//可连=
}
int *mAge;
}
int main(){
Person p1(18);
Person p2(20);
p2=p1;
}
关系运算符重载
class Person{
public:
bool operator==(Person& p){
if(this->name==p.name){
return true;
}
}
}
函数调用运算符重载
即仿函数
class myprint{
public:
void operator()(string test){
cout<<test<<endl;
}
};
int main(){
myprint p;
p("hhhhh");
}