《More Effective C++》重点摘要二:操作符
2015-04-26 09:41
190 查看
对定制的“类型转换函数”警觉。两种函数允许编译器执行类型转换:1)单变量constructors;2)隐式类型转换操作符。第一种函数可以是明确只有一个单变量的constructor,也可以是拥有除第一个参数外其他参数有默认值的constructor。当编译器发现需要某个类型的对象而实际得到的对象类型不匹配时,它会尽力搜索一种能够执行转换的方式,这个时候以得到的实际类型对象为参数的单变量constructor就成了候选者,这很有可能不是需要的,所以要格外小心。杜绝的方式是将单变量constructors声明为explicit类型的。第二种函数如果要写,确保是需要的,也要确保操作是无害的。
区别increment/decrement操作符的前置(prifix)和后置(postfix)形式。前置形式的++与—操作符先做自身的+1/-1操作,然后返回自身,后置形式的++与–操作符会返回当前值,然后再做自身的+1/-1操作。如果要重载自己的自加/自减操作符,请确保与内置类型的自加/自减操行为一致。前置形式返回一个引用,后置形式则要返回const对象。尽量使用前置形式的操作符。
千万不要重载&&,||操作符。如果重载了操作符,那么就相当于添加了函数,而函数参数的估值顺序是不可控的,达不到内置&&和||操作符“短路求值”的效果,这就可能会带来伤害。逗号操作符会顺序执行逗号分开的语句,但是作为一个操作符,它的返回值是最后一个语句的返回值,这样的行为也是无法模拟的,所以逗号操作符也最好不要重载。还有一些操作符是不能重载的,它们是:
. .* :: ?: new delete sizeof typeid static_cast dynamic_cast const_cast reinterpret_cast
可以重载的操作符是:
/ % * + - ^ & | ~ ! = < > <= >= == != += -= = /= %= ^= &= |= << >> <<= >>= += – , -> -> () [] operator new operator delete operator new[] operator delete[]
可以重载的操作符要格外小心,像本条款开头的那样,尽量避免无意的伤害。
了解各种不同意义的new和delete。系统自带的用得最多的new和delete成为new operator和delete operator,这两位一旦使用,会执行两个步骤,分别是申请/释放内存,调用构造/析构函数,它们是不能重载的。而operator new和operator delete是可以重载的,它们两个都有各自的兄弟版本operator new[]、operator delete[],这几个操作符只负责申请/释放内存,不会调用构造/析构函数。而placement new操作符负责在指定的内存空间上构造对象,如果交给placemen new的那块内存是动态分配而来的,也需要手动删除,这些各种版本的new和delete都是配套使用的,不可交叉使用。
区别increment/decrement操作符的前置(prifix)和后置(postfix)形式。前置形式的++与—操作符先做自身的+1/-1操作,然后返回自身,后置形式的++与–操作符会返回当前值,然后再做自身的+1/-1操作。如果要重载自己的自加/自减操作符,请确保与内置类型的自加/自减操行为一致。前置形式返回一个引用,后置形式则要返回const对象。尽量使用前置形式的操作符。
千万不要重载&&,||操作符。如果重载了操作符,那么就相当于添加了函数,而函数参数的估值顺序是不可控的,达不到内置&&和||操作符“短路求值”的效果,这就可能会带来伤害。逗号操作符会顺序执行逗号分开的语句,但是作为一个操作符,它的返回值是最后一个语句的返回值,这样的行为也是无法模拟的,所以逗号操作符也最好不要重载。还有一些操作符是不能重载的,它们是:
. .* :: ?: new delete sizeof typeid static_cast dynamic_cast const_cast reinterpret_cast
可以重载的操作符是:
/ % * + - ^ & | ~ ! = < > <= >= == != += -= = /= %= ^= &= |= << >> <<= >>= += – , -> -> () [] operator new operator delete operator new[] operator delete[]
可以重载的操作符要格外小心,像本条款开头的那样,尽量避免无意的伤害。
了解各种不同意义的new和delete。系统自带的用得最多的new和delete成为new operator和delete operator,这两位一旦使用,会执行两个步骤,分别是申请/释放内存,调用构造/析构函数,它们是不能重载的。而operator new和operator delete是可以重载的,它们两个都有各自的兄弟版本operator new[]、operator delete[],这几个操作符只负责申请/释放内存,不会调用构造/析构函数。而placement new操作符负责在指定的内存空间上构造对象,如果交给placemen new的那块内存是动态分配而来的,也需要手动删除,这些各种版本的new和delete都是配套使用的,不可交叉使用。
相关文章推荐
- 《More Effective C++》重点摘要一:基础议题
- More Effective C++ 读书摘要(五、技巧2)Item28 - 29
- More Effective C++ 读书摘要(auto_ptr的一个实现)
- More Effective C++:不要重载的操作符
- 《More Effective C++》读书笔记-操作符
- More Effective C++ 条款6 区别 increment/decrement 操作符的前置(prefix)和后置(postfix)形式
- 《More Effective C++》学习心得(六)各种new和delete操作符
- More Effective C++ 读书摘要(三、异常)Item9 - 15
- ###《More Effective C++》- 操作符
- More Effective C++(条款7:千万不要重载&&,||,和,操作符)
- More Effective C++ 条款7 千万不要重载&&,||和,操作符
- 《More Effective C++》Rule7:千万不要重载 &&, ||, 和 ,操作符
- More Effective C++议题【六】:关于自增、自减操作符的一些讨论
- More Effective C++ 条款22 考虑以操作符复合形式(op=)取代其独身形式(op)
- [More Effective C++ 学习笔记]基础议题和操作符
- More Effective C++ 读书摘要(目录索引)
- More Effective C++ 读书摘要(四、效率)Item16 - 24
- More Effective C++----(6)自增、自减操作符前缀形式和后缀形式的区别
- More Effective C++ 读书笔记 之 C++转型操作符
- More Effective C++之Item M6:自增(increment)、自减(decrement)操作符前缀形式与后缀形式的区别