下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

在C++中操作符重载的操作步骤

作者:课课家教育     来源: http://www.kokojia.com点击数:958发布时间: 2016-12-24 08:29:21

标签: C++二元操作符编程代码

大神带你学编程,欢迎选课

  操作符重载,计算机学科概念,就是把已经定义的、有一定功能的操作符进行重新定义,来完成更为细致具体的运算等功能。操作符重载可以将概括性的抽象操作符具体化,便于外部调用而无需知晓内部具体运算过程。在C++中,用户所定义的类型,有以下几种:,复数,联合体,字符串,日期以及文件常常重载二元+操作符。通通都是用来实现对象的连接,附加又或者是合并机制的。但是如果我们想要正确的实现+操作符,那么就会给设计,实现和性能带来一定的挑战。今天我们要学习的就是:在C++中操作符重载的操作步骤。

在C++中操作符重载的操作步骤_C++_二元操作符_编程代码_课课家

  在教程开始之前,小编先让大家考虑以下这个表达式。表达式如下:intx=4+2;

  在这个表达式中,大家可以知道些什么吗?其实在内建的+操作符是有两个类型一模一样的操作数,将它们都相加以后并且返回到表达式右边的值6,然后就会被赋值给x。那么我们就可以非常的肯定一点,那就是内建的+操作符是一个二元的,可交换以及对称的。它所产生的结果类型会和其操作数的类型一模一样。只要我们按照这个规测,那么当我们为某一个用户所定义类型重载操作符的时候,也应该要遵循一下相应内建操作符的特征咯。

  其实为用户所定义类型重载+操作符,这是一个十分常见的编程任务。就算在C++中,已经为我们提供了好几种实现的方法,但是它们会非常的容易让人在设计上的产生一种误解。那么这种误解会给我们带来些怎样的影响呢?它往往会影响到编程代码的性能,正确性以及和标准库组件之间的兼容性。那么接下来小编就带大家来分析一下内建操作符的特征吧,另外小编还会尝试着模仿其相对应的重载机制。具体的操作步骤如下:

  操作步骤一:在非成员函数以及成员函数之间进行选择

  如果我们想要实现二元操作符,那么大可以使用类成员函数的方式来进行实现。就比如说:+、-以及==。为了方便大家的理解,小编特意找了一个例子,具体的例子如图所示:

在非成员函数以及成员函数之间进行选择

  不知道大家通过以上的例子,有没有发现些什么问题?细心的朋友,应该也会发现其实这个方法是有问题的。相对于其内建的操作符来说,重载的操作符在这里是并不具有对称性的;它有两个参数,这两个参数分别是:一个类型是:constString&,而另外一个类型是:constString*const(其实这一个参数是隐含的)。所以在一些STL算法以及容器将没有办法正确的处理类似于这样的对象。

  当然啦,我们还有另外一个可选方法。这个方法就是将重载操作符+定义成为一个外部(即extern)函数,这个外部函数会带两个类型一模一样的参数,就比如说:Stringoperator+(constString&s1,constStrings2);

  这样子做的话,类String就一定要把这个重载操作符声明成为友元了。具体的编程代码,如图所示:

编程代码

  操作步骤二:返回值的两难选择

  就好像小编在前面所说的那样,内建操作符+返回右边的值,它的类型是和操作数一模一样的。但是如果我们要在调用者堆栈里返回一个对象的话,那么效率就会变的很低了,处理大型对象的时候尤其如此。那么问题就来了,我们究竟可不可以返回一个引用又或者是指针呢?小编可以很准确的告诉大家,答案是不可以的。现在小编就来解释一下吧,那是因为返回指针破坏参数类型和返回值类型应该一模一样的规则。更糟糕的情况就是,链接多个表达式就会变成不可能的现象。如图所示:

返回值的两难选择

  虽然在这里我们还有一个办法可以定义额外的+操作符来进行重载版本,但是小编认为这种办法是我们大家都并不希望使用到的。为什么呢?那是因为返回的指针一定要指向动态分配的对象。这样子做的话,假如说调用者所释放(delete)返回的指针失败的话,那么就会导致内存泄漏的情况出现。显然,返回String*的方法并不是一个很好的主意。

  有人会问小编,返回String&究竟好不好呢?返回的引用就一定要是一个有效的String。这样子它就可以避免了使用动态对象分配,这种方法返回的是一个本地静态对象的引用。没错,静态对象的的确确是解决了内存泄漏问题,但是小编认为这种方法的可行性依然是值得我们去怀疑的。在一个多线程应用中,两个线程就有可能会并发调用+操作符,那么就会造成String对象的混乱的现象。另外一个方面,那是因为静态对象一直都是保留其调用前的状态,因此我们是很有必要针对每一次+操作符的调用都应该清除这个静态String对象的。由此看来,在堆栈上返回结果依然是最简单以及最安全的解决方案。所以大家一定要慎重考虑哟!

  小编结语:

  通过这篇编程语言教程,不知道大家是否已经学会了在C++中操作符重载的操作步骤呢?如果还是不太懂,可以看多几遍教程哟!感谢大家对课课家教育的大力支持,你们的支持就是我们最大的动力。

赞(12)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程