1.运算符重载 所谓重载,就是赋予新的含义。函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作。**运算符重载(Operator Overloading)**也是一个道理,同一个运算符可以有不同的功能。
实际上,我们已经在不知不觉中使用了运算符重载。例如,+号可以对不同类型(int、float 等)的数据进行加法操作;<<既是位移运算符,又可以配合 cout向控制台输出数据。C++本身已经对这些运算符进行了重载。C++ 也允许程序员自己重载运算符,这给我们带来了很大的便利。
谈谈我的个人理解来帮助理解运算符重载:
首先,如果是两个常见的变量比如int a=10和int b=5,我们可以进行加法操作int c=a+b,这个编译器是可以理解的,但是如果我现在定义一个类:
class Person{ public: int m_a; int m_b; } int main(){ Person p1,p2; p1.m_a=10; p1.m_b=10; p2.m_a=5; p2.m_b=5; }
我们在这个例子中实例化了两个对象p1和p2,假设我现在要实例化一个对象p3,其属性的赋值是
p3.m_a=p1.m_a+p2.m_a; p3.m_b=p1.m_a+p2.m_b;
但是这样太复杂了,如果美创建一个对象都是怎么做的话,太复杂了,自然而然的我们想到定义一个函数去解决这类问题。这里可以采用成员函数也可以使用全局函数来解决问题,但C++中一般更喜欢成员函数。
class Person{ public: int m_a; int m_b; Person personadd(Person &p); } Person Person::personadd(Person &p){ Person temp; temp.m_a=this->m_a+p.m_a; temp.m_b=this->m_b+p.m_b; } int main(){ Person p1,p2; p1.m_a=10; p1.m_b=10; p2.m_a=5; p2.m_b=5; Person p3=p1.personadd(p2);//???????????????? }
经过 我们写的一个成员函数后,是不是就可以利用上面的代码建立p3对象啦,比原来的慢慢赋值方便多了,那么假设现在编译器规定了函数名只能叫operator+,那么我们是不是要变成这样使用:
class Person{ public: int m_a; int m_b; Person operator+(Person &p); } Person Person::operator+(Person &p){ Person temp; temp.m_a=this->m_a+p.m_a; temp.m_b=this->m_b+p.m_b; } int main(){ Person p1,p2; p1.m_a=10; p1.m_b=10; p2.m_a=5; p2.m_b=5; Person p3=p1.operator+(p2);//???????????????? }
其实这就是对+号进行了重载,定义p3的代码可以写成Person p3=p1+p2,所以我们这里运算符重载的本事就是一个函数的重载而已,对运算符重载实质了解之后,再来学习运算符的重载。