摘要:
1、首先,确认什么是临时对象。在swap方法中,建立一个对象temp,程序员往往把temp称为临时对象。实际上,temp是个局部对象。C++中所谓的临时对象是不可见的,产生一个non-heap对象,并且没有命名,便是一个临时对象。2、临时对象的来源有:隐式类型转换,方法返回值,抛出异常的时候。3、隐式类型转换:在初始化或者赋值的过程中,如果类型不匹配,需要一个适配的临时对象,编译器会构造这个临时对象,使调用成功。 注意:这种适配,只能执行一次,不能执行多次。为什么?假如可以执行多次,从一个对象到另一个对象,存在很多转换路径,编译器不可能找出所有的路径。就算可以找出所有的路径,存在多条转换路径.
阅读全文
posted @ 2014-02-11 20:24
Andy Niu
阅读(422)
推荐(0)
编辑
摘要:
1、catch语句的参数有三种方式:by pointer,by value,by reference。2、首先考虑,by pointer。这意味着抛出端必须抛出一个对象的地址。那么问题来了: 如果这个对象分配在栈上,离开作用域,对象销毁,catch语句中指针指向一堆垃圾。 因此,这个对象不能分配在栈上,也就是说,离开了作用域对象仍然存在,没有销毁。那就只能是static对象,或者是heap对象。那么问题又来了,在catch语句的客户端,客户到底要不要执行delete呢?客户不知道这个对象是static还是heap对象。如果执行delete,而抛出端的对象是static,对不是在heap上分..
阅读全文
posted @ 2014-02-11 19:38
Andy Niu
阅读(425)
推荐(0)
编辑
摘要:
1、方法参数的声明语法和catch语句的语法是一样的,你可能会认为主调方法调用一个方法,并向其传递参数,与抛出一个异常传递到catch语句是一样的,是的,有相同之处,但也有更大的不同。2、主调方法调用一个方法,控制权转移,被调方法执行完,控制权最终还会返回到主调方法。但是,抛出异常到达catch语句,控制权不会再回到抛出端。3、那么问题来了,抛出异常到达catch语句,控制权不再会到抛出端,这意味着,抛出的异常离开了作用域,自动销毁,那么catch语句还怎么捕获异常对象呢? 解决办法是:建立一个临时对象,对抛出的异常进行copy构造。特别注意的是,不管什么情况,这个临时对象是必不可少的。根本.
阅读全文
posted @ 2014-02-11 18:56
Andy Niu
阅读(655)
推荐(0)
编辑