您的位置:首页 > 编程语言 > C语言/C++

《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都是配套使用的,不可交叉使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: