当前位置: 首页 > 图文教程 > 开发语言 > VC++ > C++ 中重载 + 操作符的正确方法
| C++ 中重载 + 操作符的正确方法 原文出处:Overloading Operator + the Right Way
用户定义的类型,如:字符串,日期,复数,联合体以及文件常常重载二元 + 操作符以实现对象的连接,附加或合并机制。但是要正确实现 + 操作符会给设计,实现和性能带来一定的挑战。本文将概要性地介绍如何选择正确的策略来为用户定义类型重载这个操作符。 考虑如下的表达式: int x=4+2; 内建的 + 操作符有两个类型相同的操作数,相加并返回右值 6,然后被赋值给 x。我们可以断定内建的 + 是一个二元的,对称的,可交换的操作符。它产生的结果的类型与其操作数类型相同。按照这个规测,当你为某个用户定义类型重载操作符时,也应该遵循相应内建操作符的特征。 class String{public: bool operator==(const String & s); // 比较 *this 和 s}; 这个方法是有问题的。相对于其内建的操作符来说,重载的操作符在这里不具有对称性;它的两个参数一个类型为:const String * const(这个参数是隐含的),另一个类型为:const String &。因此,一些 STL 算法和容器将无法正确处理这样的对象。 String operator + (const String & s1, const String s2); 这样一来,类 String 必须将该重载操作符声明为友元: class String{public: friend String operator+(const String& s1,const String&s2);}; 第二步:返回值的两难选择 String s1,s2,s3;String res;res=s1+s2+s3; // 不可能用 String* 作为返回值 虽然有一个办法可以定义额外的 + 操作符重载版本,但这个办法是我们不希望用的,因为返回的指针必须指向动态分配的对象。这样的话,如果调用者释放(delete)返回的指针失败,那么将导致内存泄漏。显然,返回 String* 不是一个好主意。 |
评论 (0) All