2014年2月12日
摘要: 1、为了在运行期处理异常,程序必须做大量额外的工作。比如,即使抛出异常,也必须保证离开作用域的栈上对象执行析构方法。因此,必须记录try语句的进入点和离开点,记录catch语句能够处理的异常等。这就意味着,程序目标码变大,执行速度慢。2、即使从未使用任何异常处理,还是必须要付出最低代价,付出一些空间,放置某些数据结构,付出一些时间,保持数据结构的正确性。3、即使自己的程序没有使用throw,try,catch语句,使用的其他程序库可能有异常处理,因此也要付出代价。4、对于try语句,没有异常抛出的情况下,代码膨胀5%-10%,速度也下降这个数。5、如果抛出异常,影响很大,速度可能会比正常情况下 阅读全文
posted @ 2014-02-12 19:21 Andy Niu 阅读(366) 评论(0) 推荐(0) 编辑
摘要: 1、方法返回对象,会导致临时对象的产生,这降低了效率,const Rational operator* (const Rational& lhs,Rational& rhs)。有没有什么解决办法呢?2、试图返回引用,方法内的局部对象,在方法执行完后销毁,这个引用指向垃圾。不可行。3、试图返回指针,这导致奇怪的语法Rational c = *(a*b); 并且要求客户执行delete,这不合理。就算客户正确执行delete,有些情况,方法返回值没有暴露指针,客户无法执行delete,比如:Rationald = *(a*b*c); 不可行。4、因此,必须返回对象。那该怎么办呢? 阅读全文
posted @ 2014-02-12 18:59 Andy Niu 阅读(345) 评论(0) 推荐(0) 编辑
摘要: 1、判断是copy构造还是copy赋值,不是看是否有赋值操作符=,而是看对象当前是否已经有值了。如果没有值,就是copy构造。如果已经有值了,就是copy赋值。2、对象赋值的时候,源端与目标端类型不吻合,肯定要进行一次适配(而且只能是一次),中间产生一个临时对象。3、比如:Person p; p = 6; copy赋值的时候,要求rhs是个const Person&,显然6不是。因此,这里适配一下,用6构造一个临时对象,然后rhs指向这个临时对象。 那么接着思考,子类对象赋值给父类对象,会造成对象切割。那么这个过程是否产生临时对象呢?Person p; Student s; p=s; 阅读全文
posted @ 2014-02-12 18:34 Andy Niu 阅读(728) 评论(0) 推荐(0) 编辑
摘要: 1、引用必须初始化,而且不能修改指向,这一点和const对象十分相似。2、引用和指针用法不同,对于引用int& ri = a; rhs是个对象,引用前面加&;对于指针,int* pi = &a; rhs是个对象地址,指针前面加*。注意:引用往往是用指针实现的,从int& ri = a; 可以认为a赋给ri,再取地址。3、引用是一个对象的别名,不能指向为空,而且自始至终是这个对象的别名。指针是地址,可以指向为空,也可以指向不同的对象。4、考虑对引用初始化:引用是一个对象的别名。引用不能指向为空,但是通过一定技巧,可以让引用指向为空。考虑,先让指针指向为空(0),解 阅读全文
posted @ 2014-02-12 18:13 Andy Niu 阅读(420) 评论(0) 推荐(0) 编辑