operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。 这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。
一、为什么使用操作符重载?
二、如何声明一个重载的操作符? if (this->age==ps.age) person p1(10); B:操作符重载实现为非类成员函数(全局函数) //满足要求,做操作数的类型被显示指定
C:如何决定把一个操作符重载为类成员函数还是全局名字空间的成员呢?
(1) 只有C++预定义的操作符集中的操作符才可以被重载; (2)对于内置类型的操作符,它的预定义不能被改变,应不能为内置类型重载操作符,如,不能改变int型的操作符+的含义; (3) 也不能为内置的数据类型定义其它的操作符; (4) 只能重载类类型或枚举类型的操作符; (5) 重载操作符不能改变它们的操作符优先级; (6) 重载操作符不能改变操作数的个数; (7) 除了对( )操作符外,对其他重载操作符提供缺省实参都是非法的;
E: 注意点 (2) +号等这样的操作符没有对象可以容纳改变后值,对于这样的情况最好返回数值,否则只能要操作符体内创建临时对象用于容纳改变后的值,如果在堆中创建临时对象返回指针或者引用,在操作符函数体外还需要释放它,如果返回的对象而不是引用或者指针,那么效率是比较低的。如果返回的是数值,最好在该类的构造函数中增加对该类型数值的转换函数,如:返回值是int类型,那么最好有一个int类型作为参数的构造函数。 (3)在增量运算符中,放上一个整数形参,就是后增量运行符,它是值返回,对于前增量没有形参,而且是引用返回,示例: class Test { public: Test(x=3){ m_value = x} Test &operator ++(); //前增量 Test &operator ++(int);//后增量 private: Int m_value: }; Test &Test::operator ++() { m_value ++; //先增量 return *this; //返回当前对象 } Test Test::operator ++(int) { Test tmp(*this); //创建临时对象 m_value ++; //再增量 return temp; //返回临时对象 } (4)因为强制转换是针对基本数据类型的,所以对类类型的转换需自定义; (5) 转换运行符重载声明形式:operator 类型名();它没有返回类型,因为类型名就代表了它的返回类型,所以返回类型显得多余。 (6)一般来说,转换运算符与转换构造函数(即带一个参数的构造函数)是互逆的,如有了构造函数Test(int),那么最好有一个转换运算符int()。这样就不必提供对象参数重载运算符了,如Test a1(1);Test a2(2); Test a3; a3 = a1+a2;就不需要重载+号操作符了,因为对于a1+a2的运算,系统可能会先找有没有定义针对Test的+号操作符,如果没有,它就会找有没有针对Test类转换函数参数类型的+号操作符(因为可以将+号运行结果的类型通过转换函数转换为Test对象),因为Test类有个int类型的参数,对于int类型有+操作符,所以a1+a2真正执行的是Test(int(a1) + int(a2));即Test(3); (7)对于转换运算符,还有一个需要注意的地方就是,如果A类中有以B为参数的转换函数(构造函数),那B中不能有A的转换运算符,不然就存在转换的二义性,如: class A{A(B&){…}}; class B{ operator A(){…}};那么以下语句就会有问题: B b; A(b);//A(b)有就可能是A的构造函数,也可以是B的转换运算符 |
|