在不同的情况下,进行运算(不同类别)
加法运算符重载 +
以下的Person是一个类
作用:自定义的数据类型相加
1、使用成员函数,将函数名更改为operator+即可,
Person operator+(Person p){
Person temp;
temp.m_a=this->m_a+p.m_a;
return temp;
}
//主函数里面
Person p1,p2,p3;
p3.m_a=1,p2.m_a=2;
p3=p1+p2;
2、使用全局函数,需要添加引用&,同理将函数名改为operator+即可。
Person operator+(Person &p1,Person &p2){
Person temp;
temp.m_a=p1.m_a+p2.m_a;
return temp;
}
除以上,其他数据类型的+也可以发生重载,只需要将函数名命名为oprator+即可
注意:内置的数据类型表达式不可以重载,
不可以滥用运算符重载
左移运算符重载
这里的左移运算符是cou<<输出的左移,而不是位运算的左移,输出类等
//通常不使用成员函数重载,只用全局函数重载,成员函数重载其格式不一样cout一般是标准输出流ostream,
ostream &operator<<(ostream &cout.Person &p){
cout<<"m_a="<<p.m_a<<"m_b="<<p.m_b;
return cout;
}
//这里的cout可以改名称,引用只是起别名。
//如果是类的私有变量,可以将函数作为类的友元,则可以访问私有变量的
递增运算符重载 ++
作用:编写一个自己的整型变量
//成员函数
MyInterger(){
int m_Num =0;
}
//同上,将<<改为++即可
MyInterger& operator++(){//前置 返回指针
m_Num++;
return *this;
}
MyInterger operator++(int){//后置 返回值
//m_Num++;
MyInterger temp=*this;
m_Num++;
return temp;
}
//前置运算符返回指针,后置递增返回值
赋值运算符重载
4、赋值运算符operator=属性进行值拷贝
所有的成员函数属于类Person
class Person(){
public:
Person(int age){
m_Age=new int(age);
}
~Person(){
if(m_Age!=NULL){
delete m_Age;//堆区内存重复释放,引发异常此时需要重载=运算符
}
}
int *m_age;
//重载赋值运算符
Person& operator=(Person &p){
//m_Age=p.m_Age;//编译器提供的浅拷贝
if(m_Age!=NULL){
delete m_Age;
m_Age=NULL;
}
m_Age= new int(*p.m_Age);//深拷贝
return *this;
}
}
关系运算符重载
作用:可以让两个自定义类型对象进行比较
成员函数中重载,同上,不同运算符重载主要区别为参数位数不同。
bool operator==(Person &p){
if(this->m_Num ==p.m_Num){
return true;
}
return false;
}
//大于、小于、不等于类似
函数调用运算符重载()
1、函数调用运算符也可以重载()
2、由于重载后的使用方式非常像函数的调用,因此称作为仿函数
3、为函数没有固定写法,非常灵活
//成员函数
void operator()(string test){
cout<<test<<endl;
}
//主函数
Person myPrint;
myPrint("hello world!\n");
//则直接输出了这个hello world!
//匿名函数对象,对象使用后会消失,只是临时出现
cout<<Person()("hello\n")<<endl;