1. 赋值运算符重载
假如我们有一个类Person,其中有int*类型的变量a,实例化成员p1和p2,现在想让p2的值赋值给p1:
class Person {
public:
int* a;
};
直接赋值如下,但会遇到一个问题,就是当我们释放p2时,再释放p1时会报错,原因在于这种赋值操作是浅拷贝,而非深拷贝,于是我们应该考虑重载赋值运算符实现深拷贝
p1 = p2;
注意我们对=进行重载时,重载函数一定要写在类里,即它必须是成员函数!重载代码如下:
Person& operator = (Person& p) {
//先判断是否有属性在堆区已经被创建,如果有,则先释放,再做深拷贝
if (a == NULL) {
delete a;
a = NULL;
}
a = new int(*p.a);
return *this;
}
2. 关系运算符重载
比如我们需要比较两个实例化对象中的成员值是否相同,来实现比较这两个对象是否相同,我们就需要重载==运算符,不等关系或者大于小于关系都是同样的,代码如下
bool operator == (Person& p) {
// 判断
}
注意上述重载函数应该作为成员函数,也就是说要写在class里面。
3. 函数调用运算符重载
函数调用运算符就是小括号:(),这样做能使得我们利用类的实例化对象来直接作为函数调用(在效果上和函数调用是类似的,称为仿函数)
在class里写:
void operator()(string str) {
cout << str << endl;
}