当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++中重载+操纵符的正确要领

C++中重载+操纵符的正确要领

2017-11-05 08:00 星期日 所属: C语言/C++ 教程 浏览:558

摘要:本文提要性地先容如何选择正确的计策来为用户界说范例重载 + 操纵符。

用户界说的范例,如:字符串,日期,复数,连系体以及文件经常重载二元 + 操纵符以实现工具的毗连,附加或归并机制。可是要正确实现 + 操纵符会给设计,实现和机能带来必然的挑战。本文将提要性地先容如何选择正确的计策来为用户界说范例重载这个操纵符。

思量如下的表达式:
int x=4+2;

内建的 + 操纵符有两个范例沟通的操纵数,相加并返回右值 6,然后被赋值给 x。我们可以断定内建的 + 是一个二元的,对称的,可互换的操纵符。它发生的功效的范例与其操纵数范例沟通。凭据这个规测,当你为某个用户界说范例重载操纵符时,也应该遵循相应内建操纵符的特征。

为用户界说范例重载 + 操纵符是很常见的编程任务。尽量 C++ 提供了几种实现要领,可是它们容易使人发生设计上的误解,这种误解经常影响代码的正确性,机能以及与尺度库组件之间的兼容性。

下面我们就来阐明内建操纵符的特征并实验仿照其相应的重载机制。

第一步:在成员函数和非成员函数之间选择

你可以用类成员函数的方法实现二元操纵符如:+、- 以及 ==,譬喻:

class String
{
public:
    bool operator==(const String & s); // 较量 *this 和 s
};
  这个要领是有问题的。相对付其内建的操纵符来说,重载的操纵符在这里不具有对称性;它的两个参数一个范例为:const String * const(这个参数是隐含的),另一个范例为:const String &。因此,一些 STL 算法和容器将无法正确处理惩罚这样的工具。

别的一个可选要领是把重载操纵符 + 界说为一个外部(extern)函数,该函数带两个范例沟通的参数:

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* 不是一个好主意。

那么返回 String& 好欠好呢?返回的引用必需必然要是一个有效的 String。它制止了利用动态工具分派,该要领返回的是一个当地静态工具的引用。静态工具确实办理了内存泄漏问题,但这个要领的可行性仍然值得猜疑。在一个多线程应用中,两个线程大概会并发挪用 + 操纵符,因此造成 String 工具的杂乱。并且,因为静态工具老是保存其挪用前的状态,所以有须要针对每次 + 操纵符的挪用都排除该静态 String 工具。由此看来,在仓库上返回功效仍然是最安详和最简朴的办理方案。

 

    关键字:

天才代写-代写联系方式