C++类和对象-重载运算符

运算符重载:采用operator对运算符进行重新定义,本文将对+、++、<<、=、==进行示例,其余运算符可推。 ## 重载加号运算符 加号运算符可以采用成员函数、全局函数两种方式重载。 成员函数重载+:

1
2
3
4
5
6
person operator+(person &per)
{
person temp;
temp.m_A = this->m_A + per.m_A;
return temp;
}
全局函数重载+:
1
2
3
4
5
6
person operator+(person& p1, person& p2)
{
person temp;
temp.m_A = p1.m_A + p2.m_A;
return temp;
}
## 重载递增运算符 在C++中,++符号位于变量前和变量后含义不同,因此需要区分。 成员函数重载前置++:
1
2
3
4
5
person &operator++()//前置返回引用才能嵌套
{
m_A++;
return *this;
}
成员函数重载后置++:
1
2
3
4
5
6
person operator++(int)//后置需要占位参数
{
person temp = *this;
m_A++;
return temp;
}
## 重载左移运算符 类变量不可直接输出,通过重载左移运算符可直接通过cout输出对象:
1
2
3
4
5
ostream &operator<<(ostream &cout, person5 p) //返回引用
{
cout << p.m_A;
return cout;
}
## 重载赋值运算符 编译器提供的=只能进行浅拷贝,如果需要深拷贝则需要重载=运算符:
1
2
3
4
5
6
7
8
9
10
11
12
person &operator=(person &p)
{
//判断是否有属性在堆区,有则清干净
if (m_Age != NULL)
{
delete m_Age;
m_Age = NULL;
}
//深拷贝
m_Age = new int(*p.m_Age);
return *this;
}
## 重载关系运算符
1
2
3
4
5
bool operator==(person p)
{
if (p.m_Name == m_Name && p.m_Age == m_Age) return true;
else return false;
}
## 仿函数 可以通过重载()来产生仿函数,譬如:
1
2
3
4
void operator()(string str)
{
cout << str << endl;
}
可通过变量名("输出内容");来输出字符串。 仿函数的应用非常灵活,在此无法一一列举。