运算符的重载(1)
#写在前面
运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。
运算符重载(operator overloading)只是一种“语法上的方便”,也就它只是另一种函数调用的方式。
在C++中,可以定义一个处理类的新运算符。这种定义很像一个普通的函数定义,只是函数的名字由关键字operator
及其紧跟的运
算符组成。差别仅此而已。它像任何其他函数一样也是一个函数,当编译器遇到适当的模式时,就会调用这个函数。
重载运算符的参数数量与该运算符作用的对象数量一样多。一元运算符有一个参数,二元运算符有两个参数。对于二元运算符来说,左侧运算符对象传递给第一个参数,而右侧运算符对象传递给第二个参数。除了重载的函数调用运算符operator()
之外,其他重载运算符不能含有默认实参。
如果一个重载运算符函数时成员函数,则它的第一个(左侧)运算符对象绑定到隐式地this指针上,因此,成员运算符函数的(显式)参数数量比运算符的运算对象总数少一个。
#1.关系运算符重载
#include <iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(string name, int age);
bool operator==(Person &p);//==运算符重载
bool operator!=(Person &p);//!=运算符重载
private:
string m_Name;
int m_Age;
};
Person::Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
bool Person::operator==(Person & p)
{
if (this->m_Name == p.m_Name&&this->m_Age == p.m_Age)
{
return true;
}
return false;
}
bool Person::operator!=(Person & p)
{
if (this->m_Name == p.m_Name&&this->m_Age == p.m_Age)
{
return false;
}
return true;
}
void test()
{
Person p1("Aoki", 22);
Person p2("Aoki", 22);
Person p3("Aoki", 20);
if (p1 == p2)
{
cout << "p1和p2相等" << endl;
}
else
{
cout << "p1和p2不相等" << endl;
}
if (p1 != p3)
{
cout << "p1和p3不相等" << endl;
}
else
{
cout << "p1和p3相等" << endl;
}
}
int main()
{
test();
}
输出结果如下:
#2.自增自减运算符重载
#include <iostream>
#include<string>
using namespace std;
class Person
{
public:
Person(){}
Person(string name, int age);
Person operator++();//前置++运算符
Person operator--();//前置--运算符重载
Person operator++(int);//后置++运算符重载
Person operator--(int);//后置--运算符重载
void show();
private:
string m_Name;
int m_Age;
};
Person::Person(string name, int age)
{
this->m_Name = name;
this->m_Age = age;
}
Person Person::operator++()
{
m_Age++;
return *this;
}
Person Person::operator--()
{
m_Age--;
return *this;
}
Person Person::operator++(int)
{
Person tmp;
tmp.m_Age = this->m_Age;
m_Age++;
return tmp;
}
Person Person::operator--(int)
{
Person tmp;
tmp.m_Age = this->m_Age;
m_Age--;
return tmp;
}
void Person::show()
{
cout << this->m_Name << "的年龄为" << this->m_Age << endl;
}
void test()
{
Person p1("Aoki",22);
p1++;
p1.show();
p1--;
p1.show();
--p1;
p1.show();
++p1;
p1.show();
}
int main()
{
test();
return 0;
}
输出结果如下:
优先使用++和–的标准形式,优先调用前置++
如果定义了++c,也要定义c++
,递增操作符比较麻烦,因为他们都有前缀和后缀形式,而两种语义略有不同。重载operator++
和operator--
时应该模仿他们对应的内置操作符。
对于++和–而言,后置形式是先返回,然后对象++或–,返回的是对象的原值。前置形式,对象先++或–,然后返回当前对象,返回的是新对象。
调用代码的时候,要优先使用前缀形式,除非确实需要后缀形式返回的原值,,前缀和后缀形式语义上是等价的,输入工作量也相当,只是效率经常会略高一些,由于前缀形式少创建了一个临时对象。
#3.加号运算符重载
#include <iostream>
#include<string>
using namespace std;
class Person
{
public:
Person() {};
Person(string a, int b) :m_name(a), m_age(b) {}
Person operator+(Person &p);
public:
string m_name;
int m_age;
};
Person Person::operator+(Person & p)
{
Person tmp;
tmp.m_age = this->m_age + p.m_age;
tmp.m_name = this->m_name + p.m_name;
return tmp;
}
void test()
{
Person p1("Ao", 20);
Person p2("ki",10);
Person p3 = p1 + p2;
cout << "p3的名字为:" << p3.m_name << ",p3的年龄为" << p3.m_age << endl;
}
int main()
{
test();
return 0;
}
输出结果如下:
下面也是加号运算符重载的一些方法:
#include <iostream>
#include<string>
using namespace std;
class Person
{
public:
Person() {};
Person(string a, int b) :m_name(a), m_age(b) {}
//Person operator+(Person &p);
public:
string m_name;
int m_age;
};
//
//Person Person::operator+(Person & p)
//{
// Person tmp;
// tmp.m_age = this->m_age + p.m_age;
// tmp.m_name = this->m_name + p.m_name;
// return tmp;
//}
Person operator+(Person &p1, Person &p2)
{
Person tmp;
tmp.m_age = p1.m_age + p2.m_age;
tmp.m_name = p1.m_name + p2.m_name;
return tmp;
}
Person operator+(Person &p1, int a)
{
Person tmp;
tmp.m_age = p1.m_age + a;
tmp.m_name = p1.m_name;
return tmp;
}
void test()
{
Person p1("Ao", 20);
Person p2("ki",10);
Person p3 = p1 + p2;
Person p4 = p2 + 10;
cout << "p3的名字为:" << p3.m_name << ",p3的年龄为" << p3.m_age << endl;
cout << "p4的名字为:" << p4.m_name << ",p4的年龄为" << p4.m_age << endl;
}
int main()
{
test();
return 0;
}
输出结果如下:
#4.减号运算符重载
#include <iostream>
#include<string>
using namespace std;
class Person
{
public:
Person() {};
Person(string a, int b) :m_name(a), m_age(b) {}
//Person operator+(Person &p);
public:
string m_name;
int m_age;
};
//Person Person::operator+(Person & p)
//{
// Person tmp;
// tmp.m_age = this->m_age + p.m_age;
// tmp.m_name = this->m_name + p.m_name;
// return tmp;
//}
Person operator-(Person &p1, Person &p2)
{
Person tmp;
tmp.m_age = p1.m_age - p2.m_age;
tmp.m_name = p1.m_name + p2.m_name;
return tmp;
}
Person operator-(Person &p1, int a)
{
Person tmp;
tmp.m_age = p1.m_age - a;
tmp.m_name = p1.m_name;
return tmp;
}
void test()
{
Person p1("Ao", 20);
Person p2("ki",10);
Person p3 = p1 - p2;
Person p4 = p2 -1;
cout << "p3的名字为:" << p3.m_name << ",p3的年龄为" << p3.m_age << endl;
cout << "p4的名字为:" << p4.m_name << ",p4的年龄为" << p4.m_age << endl;
}
int main()
{
test();
return 0;
}
输出结果如下: