MoreEffectiveC++:自增和自减
很久以前(80年代),还没有办法区分++和--运算符的前缀和后缀调用。程序员抱怨这个问题,所以C++语言被扩展以允许重载增量和减量操作符。
然而,有一个语法问题。重载函数之间的区别取决于其参数类型的不同,但递增或递减的前缀和后缀都只有一个参数。为了解决这个语言问题,C++规定后缀形式有一个int类型的参数。调用函数时,编译器将0值作为int参数传递给函数:
class UPInt {//" unlimited precision int "
public:
UPInt & operator++();//++前缀
const UPInt 运算符++(int);//++后缀
upint & operator-();//-前缀
const upint运算符-(int);//-后缀
UPInt & operator+=(int);//+=运算符,up int
//]/和int
...
};
UPInt I;
++ I;//调用I . operator++();
i++;//调用I . operator++(0);
-I;//调用I . operator-();
I-;//调用I . operator-(0);
这个规范有些奇怪,但是你会习惯的。特别需要注意的是,这些运算符的前缀和后缀返回值类型是不同的。前缀返回一个引用,后缀返回一个常量类型。接下来,我们将讨论++运算符的前缀和后缀形式。这些指令还使用AND运算符。
从你开始做C程序员的那一天起,你就记住了,增量的前缀形式有时叫做“加然后取”,后缀形式叫做“取然后加”。这两句话非常重要,因为它们是增量前缀和后缀的形式规范。
//前缀形式:添加然后检索值
UPInt & UPInt::operator++()
{
* this+= 1;//Add
return * this;//检索值
}
//后缀形式:获取和递增
const UPInt UPInt::operator++(int)
{
UPInt old value = * this;//检索值
++(* this);//add
返回oldValue//返回检索到的值
}
后缀运算符函数不使用其参数。它的参数仅用于区分前缀和后缀函数调用。如果你在函数中不使用参数,很多编译器会显示警告信息,这是很烦人的。为了避免这些警告消息,一种常见的方法是省略不想使用的参数名。
位律师回复
0条评论