条款6:区别increment/decrement操作符的前置和后置形式
2016-12-06 22:02
811 查看
//前置式:累加然后取出(increment and fetch)
//后置式:取出然后累加(fetch and increment)
扩展1:函数返回引用类型?
1.当函数返回引用类型时,没有复制返回值。相反,返回的是对象本身。
2.返回引用,要求在函数的参数中,包含有以引用方式或指针方式存在的,需要被返回的参数。
3.千万不要返回局部对象的引用或指针。当函数执行完毕时,将释放分配给局部对象的存储空间。此时,对局部对象的引用就会指向不确定的内存。返回指向局部对象的指针也是一样的,当函数结束时,局部对象被释放,返回的指针就变成了不再存在的对象的悬垂指针。
4.引用返回左值
5.由于返回值直接指向了一个生命期尚未结束的变量,因此,对于函数返回值(或者称为函数结果)本身的任何操作,都在实际上,是对那个变量的操作,这就是引入const类型的返回的意义。当使用了const关键字后,即意味着函数的返回值不能立即得到修改!
扩展2:函数返回const?
1.const用于修饰函数时,一般是const修饰类的成员函数(函数定义体),表示在函数体中成员变量不能改变; 任何不会修改数据成员(即函数中的变量)的 函数都应该声明为const 类型。如果在编写const
成员函数时,不慎修改了数据成员,或者调用了其它非const 成员函数,编译器将指出错误,这无疑会提高程序的健壮性。
2.如果给以“指针传递”方式的函数返回值加const 修饰,那么函数返回值(即指针)的内容不能被修改,该返回值只能被赋给加const 修饰的同类型指针。
3.如果函数返回值采用“值传递方式”,由于函数会把返回值复制到外部临时的存储单元中,加const 修饰没有任何价值。
后置式操作符并未动用其参数,其参数的唯一目的只是为了区别前置式和后置式而已。
后置式操作符必须返回一个对象代表旧值,但为什么是个const对象?
如果不这样,以下动作是合法的:
这和以下动作相同:
这说明operator++的第二个调用动作施行于第一个调用动作的返回对象身上。
两个理由使我们不欢迎这样的情况:
1.它和内建类型的行为不一致:int并不允许连续两次使用后置式increment操作符;
2.第二个operator++所改变的对象是第一个operator++返回的对象,而不是原对象。所以即使上述行为合法,i也只是被累加一次而已。这是违反直觉的,也容易引起混淆。
后置式函数必须产生一个临时对象,作为返回值使用,需要构造也需要析构。前置式函数就没有如此的临时现象。所以单以效率而言,尽可能地使用前置式,养成使用前置式操作符的习惯。类似地,养成复合赋值操作符的习惯。
如何确定后置式的行为与前置式的行为一致?遵循这个原则:后置式操作符的实现应以其前置式兄弟为基础。如此一来,你就只需要维护前置式版本,因为后置式版本会自动调整为一致的行为。
//前置式返回一个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也只是被累加一次而已。这是违反直觉的,也容易引起混淆。
后置式函数必须产生一个临时对象,作为返回值使用,需要构造也需要析构。前置式函数就没有如此的临时现象。所以单以效率而言,尽可能地使用前置式,养成使用前置式操作符的习惯。类似地,养成复合赋值操作符的习惯。
如何确定后置式的行为与前置式的行为一致?遵循这个原则:后置式操作符的实现应以其前置式兄弟为基础。如此一来,你就只需要维护前置式版本,因为后置式版本会自动调整为一致的行为。
相关文章推荐
- 读书笔记: More Effective ++ 操作符 条款6,区别increment/decrement操作符的前置(prefix)和后置(postfix)的形式
- More Effective C++ 条款6 区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式
- 区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
- 6. 区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
- 6. 区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
- 【M6】区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
- 区别increment/decrement操作符的前置(prefix)和后置(postfix)形式
- 6.区别increment/decrement操作符的前置和后置形式
- 条款六:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
- More Effective C++之Item M6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
- 条款六:区别++和--操作符前置和后置的区别
- 自增(increment)、自减(decrement)操作符前缀与后缀形式的区别
- Item M6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
- 自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
- 自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别
- ITEM M6 自增(INCREMENT)、自减(DECREMENT)操作符前缀形式与后缀形式的区别
- 前置和后置操作符的区别(More Effective_C++_6(运算符))
- 《More Effective C++》Rule 6:区别递加和递减符号的前置和后置形式
- 自增自减操作符的前置后置区别
- 3.自增自减操作符前缀形式与后缀形式的区别