首先,本书的翻译看起来挺别扭的,远没有effective系列朗朗上口。
但书中作者贵为贝尔实验室最早使用C++语言的人之一,相信不少观点还是值得翻看的。
关于常见错误57,有兴趣并且能解析清楚的人,相信对编译器和运行效率方面还是比较关心的。
事实上,标准是标准,实现是实现,所以编译器实现和标准有出入就不足为奇了。
所以当看到f(1337)这样貌似简单的调用,理论上居然会生成两个临时对象,相信不少人还是比较惊讶的。
因为正如书中所说,C++标准明明白白的:参数传递是以复制初始化实现的。
由于1337不是yFormalArg类型,需要先构造成功,然后和形参进行拷贝复制,于是出来了两个临时对象。
这一来,效率就烂了,有构造就有析构,还有拷贝复制,这一来一回调用多少函数?
C不会这样么?答案是不会的,因为C没有C++的所谓构造函数,实参和形参类型不匹配是不行的,但C++隐式转换就行。
但如果你真自己写代码来调试,往往又发觉不是这么一回事,实际只有一个临时对象,为啥?
呵呵,编译器实现帮你优化了,1337直接构造成形参对象,不需要婆婆妈妈搞个临时对象出来再拷贝。
当然,我们大部分时候都建议使用const&方式传递参数,这和C里面指针方式传递是一个道理。
不要小看值传递和引用传递,这里面涉及到变量作用域范围,运行时效率问题,编译器优化问题,可是一堆的。
把这些问题都能说清楚了,对C++的理解就不一样了。