一、赋值运算符(利用深拷贝的方法)
如果简单的p1=p2,相当于浅拷贝(简单赋值操作,释放内存时会造成重复释放内存空间的错误)
#include<iostream>
using namespace std;
#include<string>
class person
{
friend void test();
private:
int m_age;
int* m_height;
public:
person(int age, int height)
{
m_age = age;
m_height = new int(height);
}
~person()
{
if (m_height != NULL)
{
delete m_height;
m_height = NULL;
}
}
person & operator=(person& p)
{
m_age = p.m_age;
if (m_height != NULL)
{
delete m_height;
}
m_height = new int(*p.m_height);
return *this;
}
};
void test()
{
person p1(18, 167);
person p2(19, 166);
person p3(23, 12);
p3=p2 = p1;//如果连续赋值要注意返回值类型
cout << p3.m_age << " " << *p3.m_height << endl;
}
int main()
{
test();
system("pause");
return 0;
}
二、关系运算符(>)重载,还有==,!=,<类似
#include<iostream>
using namespace std;
class number
{
private:
int m_a;
public:
number(int a)
{
m_a = a;
}
bool operator>(number& n)
{
if (m_a > n.m_a)
{
return true;
}
else
{
return false;
}
}
};
void test()
{
number n1(10);
number n2(11);
if (n1 > n2)
{
cout << "n1大于n2" << endl;
}
else
{
cout << "n1小于n2" << endl;
}
}
int main()
{
test();
system("pause");
return 0;
}
三、函数调用运算符重载(即())
重载后的使用方式像函数调用,因此我们讲仿函数
#include<iostream>
using namespace std;
#include<string>
class printfunction
{
public:
void operator()(string text)
{
cout << text << endl;
}
};
void test()
{
printfunction pr1;
pr1("hello word");//本质上是调用函数,但是我们对调用函数进行了运算符重载
}
int main()
{
test();
}
仿函数非常灵活,没有固定写法。
可以通过匿名函数对象调用