继续学习运算符的重载,这篇学习关系运算符的重载。所谓关系运算符就是(<, >, != , ==),就是两个对象比对的关系,一般就是相等,不相等,数值还有大于或者小于。如果是基本数据类型,数值型的话,编译器已经实现。我们要做的事情就是,比较两个自定义对象的关系。
1.自定义对象的比对关系
例如有一个Person类,类有成员变量age和name,有两个Person类的对象,p1 , p2,我们想知道 p1 和p2是否相等
#include <iostream>
using namespace std;
#include <string>
class Person
{
public:
int m_Age;
string m_Name;
Person(string name, int age)
{
m_Name = name;
m_Age = age;
}
};
void test01()
{
Person p1("张三", 18);
Person p2("李四", 18);
cout << "p1和p2是否相等: " << endl;
}
int main()
{
test01();
system("pause");
return 0;
}
当前这段代码是无法告诉我们,两个自定义对象p1和p2是否相等。
2.实现关系运算符重载
我们需要指定规则,例如只要name和age都相同的情况下,才认为这两个对象是相等,所以需要类里面写一个成员函数来实现关系运算符重载。
#include <iostream>
using namespace std;
#include <string>
class Person
{
public:
int m_Age;
string m_Name;
Person(string name, int age)
{
m_Name = name;
m_Age = age;
}
bool operator==(Person &p)
{
if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
{
return true;
}
return false;
}
};
void test01()
{
Person p1("张三", 18);
Person p2("张三", 18);
if (p1 == p2)
{
cout << "p1和p2相等: " << endl;
}
else
{
cout << "p1和p2不相等: " << endl;
}
}
int main()
{
test01();
system("pause");
return 0;
}
这里实现了关系运算符==的重载,当然根据这个思路,也可以实现关系运算符!=的实现。很容易能实现下面!=的重载代码
// != 运算符重载
bool operator!=(Person &p)
{
if (this->m_Name != p.m_Name || this->m_Age != p.m_Age)
{
return true;
}
return false;
}
或者这段代码
// != 运算符重载
bool operator!=(Person &p)
{
if (this->m_Name == p.m_Name && this->m_Age == p.m_Age)
{
return false;
}
return true;
}
3.函数调用运算符重载
什么是函数调用运算符呢,例如我们main方法中test01() 这里就发生了调用,所以函数调用符号就是(),也就是小括号。函数调用运算符()也可以重载。由于重载后使用的方式非常像函数的调用,因此成为仿函数。仿函数没有固定写法,非常灵活。
#include <iostream>
using namespace std;
#include <string>
class MyPrint
{
public:
// 重载函数调用运算符
void operator()(string text)
{
cout << text << endl;
}
};
int main()
{
MyPrint print;
print("Hello World!!");
system("pause");
return 0;
}
运行结果
上面第19行代码由于看起来非常像函数调用,所以这种函数调用运算符叫做仿函数。