析构不匹配的问题

sybtjp 2008-09-23 02:54:05
关于自定义异常:
#include <iostream>
using namespace std;
class MyException{
public:
MyException(){cout < <"construction" < <endl;}
void show(){cout < <"...MyException..." < <endl;}
~MyException(){cout < <"~construction" < <endl;}
};
void fun(){
throw MyException();
}
int main(int argc, char *argv[]){
try{
fun();
}catch(MyException e){
e.show();
}
return 0;
}
对于此函数为什么会是这样的结果呢?
construction
~construction
~construction
...MyException...
~construction
~construction
不是说构造了几次就析构几次么,这里怎么不一样呢,
...全文
191 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyghe 2008-09-23
  • 打赏
  • 举报
回复
因为用了“引用”,这个和函数的传入参数是一样的。
ilovezc 2008-09-23
  • 打赏
  • 举报
回复
#include <iostream> 
using namespace std;
class MyException{
public:
MyException()
{cout <<"construction" <<endl;}
MyException(MyException &)
{cout <<"copy construction" <<endl;}
void show()
{cout <<"...MyException..." <<endl;}
~MyException()
{cout <<"~construction" <<endl;}
};
void fun(){
throw MyException();
}
int main(int argc, char *argv[]){
try{
fun();
}
catch(MyException &e){
e.show();
}
return 0;
}

得到的结果是
construction
...MyException...
~construction

为什么没有copy construction输出呢
lyghe 2008-09-23
  • 打赏
  • 举报
回复
try{ 
fun();
}catch(MyException e){
e.show();
}
return 0;

这里进入catch的时候重新建立了一个MyException对象,但是是通过MyException的拷贝构造函数构造的,而不是默认构造函数。
用这个,就不同啦:
try{ 
fun();
}catch(MyException & e){
e.show();
}
return 0;

一般来说,用引用就可以了。
  • 打赏
  • 举报
回复
……
太乙 2008-09-23
  • 打赏
  • 举报
回复


#include <iostream>
using namespace std;
class MyException{
public:
MyException(){cout <<"construction" <<endl;}
MyException(const MyException& me)
{
cout<<"fff"<<endl;
}
void show(){cout <<"...MyException..." <<endl;}
~MyException(){cout <<"~construction" <<endl;}
};
void fun(){
throw MyException();
}
int main(int argc, char *argv[]){
try{
fun();
}catch(MyException e){
e.show();
}
return 0;
}



skyering 2008-09-23
  • 打赏
  • 举报
回复
construction
~construction
...MyException...
~construction
~construction

我的运行结果。奇怪,怎么会不一样呢 ,我的是vs2008
zclever 2008-09-23
  • 打赏
  • 举报
回复

//MinGW
#include <iostream>
using namespace std;
class MyException{
public:
MyException(){cout <<"construction" <<endl;}
void show(){cout <<"...MyException..." <<endl;}
~MyException(){cout <<"~construction" <<endl;}
};
void fun(){
throw MyException();
}
int main(int argc, char *argv[]){
try{
fun();
}catch(MyException e){ //这里调用的不是你提供的默认构造函数,而是它的默认拷贝构造函数
e.show();
}
return 0;
}



//结果:
/****************************/
/*construction
...MyException...
~construction
~construction


Terminated with return code 0
Press any key to continue ...*/
/****************************/




zclever 2008-09-23
  • 打赏
  • 举报
回复

//MinGW
#include <iostream>
using namespace std;
class MyException{
public:
MyException(){cout <<"construction" <<endl;}
void show(){cout <<"...MyException..." <<endl;}
~MyException(){cout <<"~construction" <<endl;}
};
void fun(){
throw MyException();
}
int main(int argc, char *argv[]){
try{
fun();
}catch(MyException e){
e.show();
}
return 0;
}

结果:
/****************************/
construction
...MyException...
~construction
~construction


Terminated with return code 0
Press any key to continue ...
/****************************/

69,368

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧