区分++或–操作符的前置和后置形式

C++自增(++)和自减(–)运算符分别有两种形式——前置式和后置式,但我们在使用它们时,并没有明确的指明参数来表明使用的是前置式还是后置式,而是通过位置来区分的(比如++i, i++)。

1.重载区分

此外,我们还知道:一,自增自减运算符是可以重载的;二,重载一个函数是通过参数来区分比彼此的。那么问题来了,如何来区分前置和后置的自增或自减运算符呢?毕竟在使用它们的时候无需提供参数呀。

为了填上这个语言学上的漏洞,在重载自增或自减运算符时,C++通过让后置式有一个int变量来区分前置和后置,并且在它被调用时,编译器默默地为该int指定一个0值:

2.返回值区分

细心的您一定发现了,在上面的重载示例中,前置式返回一个引用,而后置式返回一个const对象。这是为什么呢?

我们知道,前置式的意义是“increment and fetch”,后置式的意义是“fetch and increment”,这就是原因。结合代码会容易理解:

其中,后置式的参数只是用来区别前置式和后置式的,在函数体内却没有使用它。但是由于没有使用这个参数,许多编译器会对此发出警告,为了避免这类警告,一种策略是故意略去你不打算使用的参数的名称,如上所示。

进一步分析返回值不同的原因:前置式返回一个引用以及后置式返回一个对象(代表旧值)我们是能够理解的。但是,为什么该对象要是一个const对象呢?想象一下,如果不这样,以下操作将是合法的:

但是,我们知道后置式返回的其实是一个旧值,那么(如何合法的话)i++++自增两次的结果应该和自增一次的结果是一样的才对。

为了遏制这种错误的情况,你应该知道为什么将后置式的++(或–)运算符的返回值声明为const类型了。

3.总结

(1)重载自增和自减运算符的后置式时,需指定一个int类型的参数;
(2)前置式返回一个reference,后置式返回一个const对象;
(3)前置式的意义“increment and fetch”,后置式的意义“fetch and increment”;
(4)处理用户自定义的类型时,应该尽可能使用前置式;
(5)后置式的自增和自减运算符的实现应该以前置式为基础。

 

参考:
More effective C++ 条款6

发表评论

电子邮件地址不会被公开。 必填项已用*标注