加号运算符重载
作用:实现两个自定义类型数据相加的运算(对应内置的数据类型,编译器知道如果运算)
实现:Person p3 = p1+p2;
- 成员函数重载
Person operator+(Person &p){
Person temp;
temp.m_A = this->m_A+p.m_A;
return temp;
}
- 全局函数重载
Person operator+(Person &p1,Person &p2){
Person temp;
temp.m_A = p1.m_A+p2.m_A;
return temp;
}
运算符重载也可以发生函数重载:Person p3 = p1+10;
//person+int
Person operator+(Person &p1,int num){
Person temp;
temp.m_A = p1.m_A+num;
return temp;
}
左移运算符重载
作用:可以输出自定义数据类型
不会利用成员函数重载<<运算符,(无法实现cout<<)–成员函数无法传入对象p。(p.operator<<(&p)).
p.operator<<(cout) —p<<cout
只能用全局函数重载左移运算符。
void operator<<(ostream &cout,Person &p){//本质operator<<(cout,p) //简化:cout<<p;
cout<<"m_A"<<p.m_A;
}
cout<<p;
若函数返回值为void,则无法cout<<p<<endl;(链式)
ostream& operator<<(ostream &cout,Person &p){//本质operator<<(cout,p) //简化:cout<<p;
cout<<"m_A"<<p.m_A;
return cout;
}
cout<<p<<endl;
递增运算符重载
作用:通过重载递增运算符,实现自己的整型数据
重载前置++
- 利用成员函数重载
Person& operator++(){
m_a++;
return *this
}
返回值加引用(Person& ),对变量进行多次++时,是对一个数据进行操作。
重载后置++
Person operator(int){//int占位参数,可以用于区分前置和后置(重载)
//先返回结果再输出
Person num = *this;
m_a++;
return num;
}
必须返回值(Person),num局部变量,运行完就被释放掉了。
赋值运算符重载
C++编译器默认会给一个类添加4个函数:4.赋值运算符operator=对属性进行值拷贝。
Person 类:
p2 = p1;//赋值操作–值拷贝
利用深拷贝,解决浅拷贝带来的问题
- 成员函数重载
Person& operator=(Person &p){//m_a是指针
//编译器提供浅拷贝
//m_a = p.m_a;
//应该先判断是否有属性在堆区,如果有先释放干净,然后再深拷贝。
if(m_a != NULL){
delete m_a;
m_a = NULL;
}
//深拷贝
m_a = new int(*p.m_a);
return *this
}
解决p3 = p2 = p1的问题,返回对象本身Person& 。
关系运算符重载
类似前面的写法。
bool operator==(Person &p){
return ture
}
函数调用运算符重载(())
- 函数调用运算符()也可以重载
- 由于重载后使用的方式非常像函数的调用,所以称为仿函数
- 仿函数没有固定写法,非常灵活
void operator()(string test){
cout<<test<<endl;
}
Person p;
p("my");//输出my
//匿名函数对象
Person()(“my”)//当前行执行完立即释放