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

本文详细解析了C++中前置式与后置式增量运算符的实现原理,并对比了两者之间的差异。同时介绍了函数返回引用类型及const修饰符的作用,帮助读者更好地理解运算符重载的细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//前置式:累加然后取出(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也只是被累加一次而已。这是违反直觉的,也容易引起混淆。

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

如何确定后置式的行为与前置式的行为一致?遵循这个原则:后置式操作符的实现应以其前置式兄弟为基础。如此一来,你就只需要维护前置式版本,因为后置式版本会自动调整为一致的行为。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值