来,我们讨论一点技术问题。
以前一直认为C++得exception比较奇怪,而且项目中也从来没用过,所以一直没怎么碰它。后来java里大量的使用exception,也就觉得习惯了,现在又要回头来研究c++ exception,发现这个东西就不那么好理解了:比如,java里throw exception一般写成:throw new RuntimeException(),这个东西是new出来得,但是java不用担心释放的问题。可是c++它怎么就直接throw一个东西呢?而且它还可以throw一个int……c++ catch得时候处理继承关系么?exception, assert, return value都在什么情况下使用呢?
网上的资料似乎都语焉不详,还是自己动手实践比较印象深刻……
首先是throw得问题:throw目前看来一般都是直接throw一个东西,那么这个东西是在stack上创建了?那么这个东西谁负责销毁呢?我的例子程序表明,这个东西好像在进入catch语句之前就被销毁了一次,好奇怪!
接下来是catch的写法:msdn的例子直接就写的catch(Exception e),而我觉得是不是写成catch(Exception& e)更好一些?还有,catch是否能够catch到某exception得所有父类呢?
试验结果:
- catch里面写reference的确比直接写value要省一次copy construction,不过即使如此,reference形式也要一次copy construction,而直接写需要两次copy construction……——这是gcc323的结果。vc6的结果看着不错,写reference只有一次构造。也许是gcc为了保护原来那个原始的exception吧。不过这样看来是不是exception class一定要有copy constructor呢?
- exception继承的问题:的确catch是可以catch一个exception及其任何parent class的类型的。不管是不是用reference来catch的。不过,不用reference catch的结果是catch到的object只是一个父类的实例——是通过父类的拷贝构造函数来构造的,而不是原始的那个exception。
- 类似java的throw new是可以的,只是,这个对象就需要手动释放了!而且只能是最后一个catch的人来释放,否则就失败了。。。所以还是别throw new了。这个跟java很不一样。
结论很简单,总是在throw语句中直接throw的同时构造一个对象就好了,catch语句应该catch其引用。其他的就交给编译器吧……