C++中重载+操作符的精确办法[VC/C++编程]
本文“C++中重载+操作符的精确办法[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
择要:本文概要性地介绍若何挑选精确的战略来为用户定义范例重载 + 操作符.
用户定义的范例,如:字符串,日期,复数,结合体以及文件常常重载二元 + 操作符以实现对象的衔接,附加或归并机制.但是要精确切现 + 操作符会给计划,实现和性能带来一定的挑衅.本文将概要性地介绍若何挑选精确的战略来为用户定义范例重载这个操作符.
考虑以下的表达式:
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 对象.由此看来,在仓库上返回后果仍旧是最安全和最简单的办理筹划.
以上是“C++中重载+操作符的精确办法[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |