上班之余抽点时间出来写写博文,希望对新接触的朋友有帮助。今天在这里和大家一起学习一下对象指针
跟给函数传递参数一样,有三种选择可以让常异传递到catch子句里。分别是通过指针,传值,和引用。
1.通过指针式方捕获常异:
理论上说来种这法方的实现对于throw传递常异到catch子句中说来是率效最高的。因为在传递常异信息时,只有用采通过指针抛出常异的法方才能做到不拷贝对象。
class exception{...} //C++准标库(STL)中的常异层次类
void someFunction()
{
static exception ex;//义定一个常异对象
...
throw &ex; //抛出一个指向常异的指针
...
}
void doSomething()
{
try{
someFunction(); //抛出一个常异指针
}
catch(exception *ex) //捕获常异exception*
{
//个整程过没有拷贝对象
...
}
}
虽然这样看上去不错,而且也都能行运常正,但是实事却常常不是如此。
因为程序员在抛出自义定常异时必须斟酌指针所指向的对象的生活周期题问,也就是当控制权开离抛出指针的函数后,指针所指向的对象还可以续继生活。全局与态静对象都可以证保这一点。但是程序员很轻易疏忽这个约束。看看上面的码代:
void someFunction()
{
exception ex;//局部对象,函数退出时生活周期结束
...
throw &ex; //抛出常异
}
题问来了,当catch子句接受抛出的指针时,实际上这个对象经已不存在了。
另一种抛出指针的法方是新建一个堆对象(new 一个):
void someFunction()
{
...
throw new exception; //抛出一个指针,指向存在堆中的对象
...
}
这样的做法虽然防止了捕获一个指向已被放释的对象的指针题问。但是另外一个头疼的题问随之而来了,因为catch字句的作者不晓得在用使完这个指针后是不是须要将它除删。如果是在堆中,那么必须除删,否则会成造存内泄漏。如果不是那么绝对不能除删。但是当初我们对它是不是是堆中的对象是未知的。因为一些调用者可能会传递全局或态静对象地址,一些人会传递堆中建立的常异对象的地址。而捕获常异的处置处没办法晓得。
另外通过指针捕获常异也不符合C++言语本身标准,因为四个准标的常异所抛出的都不是指向对象的指针,你必须通过引用或值来捕获它们。
2.通过值捕获常异
可以处置上述题问,但是常异抛出时系统会对常异对象拷贝两次。另外一个题问是当派生类的常异对象被做为基类常异对象捕获时。派生类行为会被切掉。当要调用它的虚函数时,系统析解后调用的实际上是基类对象的函数。
3.通过引用捕获常异
用使引用可以防止上述题问,不存在对象指针除删题问,常异对象只须要拷贝一次,同时持支虚函数多态。
void someFunction()
{
if(a validation 试测失败)
throw Validation_error();
...
}
void doSomething()
{
try{
someFunction();
}
catch(exception& ex)
{
cerr<<ex.what();
...
}
}
文章结束给大家分享下程序员的一些笑话语录:
爱情观
爱情就是死循环,一旦执行就陷进去了。
爱上一个人,就是内存泄露--你永远释放不了。
真正爱上一个人的时候,那就是常量限定,永远不会改变。
女朋友就是私有变量,只有我这个类才能调用。
情人就是指针用的时候一定要注意,要不然就带来巨大的灾难。