您的位置:首页 > 其它

条款6:区别increment/decrement操作符的前置和后置形式

2016-12-06 22:02 811 查看
//前置式:累加然后取出(increment and fetch)

//前置式返回一个reference
UPInt& UPInt::operator++()
{
*this+=1;   //累加
return *this;   //取出
}


//后置式:取出然后累加(fetch and increment)

const UPInt UPInt::operator++(int)
{
UPInt oldValue=*this;   //取出
++(*this);  //累加
return oldValue;    //返回先前被取出的值
}


扩展1:函数返回引用类型?

1.当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。

2.返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。

3.千万不要返回局部对象的引用或指针。当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。返回指向局部对象的指针也是一样的,当函数结束时,局部对象被释放,返回的指针就变成了不再存在的对象的悬垂指针。

4.引用返回左值

5.由于返回值直接指向了一个生命期尚未结束的变量,因此,对于函数返回值(或者称为函数结果)本身的任何操作,都在实际上,是对那个变量的操作,这就是引入const类型的返回的意义。当使用了const关键字后,即意味着函数的返回值不能立即得到修改!

扩展2:函数返回const?

1.const用于修饰函数时,一般是const修饰类的成员函数(函数定义体),表示在函数体中成员变量不能改变; 任何不会修改数据成员(即函数中的变量)的 函数都应该声明为const 类型。如果在编写const

成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。

2.如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。

3.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。

后置式操作符并未动用其参数,其参数的唯一目的只是为了区别前置式和后置式而已。

后置式操作符必须返回一个对象代表旧值,但为什么是个const对象?

如果不这样,以下动作是合法的:

UPInt i;
i++++;  //实施“后置式increment操作符”两次


这和以下动作相同:

i.operator++(0).operator(0);


这说明operator++的第二个调用动作施行于第一个调用动作的返回对象身上。

两个理由使我们不欢迎这样的情况:

1.它和内建类型的行为不一致:int并不允许连续两次使用后置式increment操作符;

2.第二个operator++所改变的对象是第一个operator++返回的对象,而不是原对象。所以即使上述行为合法,i也只是被累加一次而已。这是违反直觉的,也容易引起混淆。

后置式函数必须产生一个临时对象,作为返回值使用,需要构造也需要析构。前置式函数就没有如此的临时现象。所以单以效率而言,尽可能地使用前置式,养成使用前置式操作符的习惯。类似地,养成复合赋值操作符的习惯。

如何确定后置式的行为与前置式的行为一致?遵循这个原则:后置式操作符的实现应以其前置式兄弟为基础。如此一来,你就只需要维护前置式版本,因为后置式版本会自动调整为一致的行为。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐