关于异常类
时间:2011-11-30
来源:互联网
#include <cstdlib>
#include <cstdio>
#include <iostream>
using namespace std;
class T
{
private:
int b;
public:
static int a;
T(int);
};
int T::a = 1;
T::T(int t)
{
b = t;
}
void main()
{
int a = 0;
cin>>a;
try
{
if(a > 0)
{
throw T(a);
}
}
catch(T)
{
cout<<"I love you"<<endl;
}
}
各位给讲一讲,这个throw T(a),怎么传递给catch的,什么原理啊。T(a)表示什么啊。
作者: fuyaping0432 发布时间: 2011-11-30
在try代码块内throw了一个T对象 用a来构造它 throw后跳转到对应catchT对象的代码块执行
作者: sryan 发布时间: 2011-11-30
作者: fuyaping0432 发布时间: 2011-11-30
定义T的对象的话,不都是这样定义吗 T t(a)?为什么直接用 类名(a), 这样了呢?我这里不理解。请指导。谢谢在。
直接调用构造函数 生成个临时变量 然后throw
我在qt中用的很多 类似于假如设置brush painter->setBrush(QBrush(Qt::black));
作者: sryan 发布时间: 2011-11-30
作者: fuyaping0432 发布时间: 2011-11-30
直接调用构造函数,生成临时变量?麻烦您说的明白一点,我想把这个知识点学明白了。怎么调用构造函数,什么时候生成临时变量。真的感谢。
就是显式调用构造函数来初始化某块内存(对象) 该对象为匿名对象 然后throw它出来
作者: sryan 发布时间: 2011-11-30
作者: fuyaping0432 发布时间: 2011-11-30
catch(T)为什么可以通过,
可以讲一下吗??
我的理解:
main函数帧中有个无名对象:T(a),
然后抛出到了 main函数帧的其他内存位置,也就是拷贝生成了一个临时对象
catch(T t) .... , 你也看到了 主帖中: catch(T ) 是没有对象的,只有类名!!!!
引用 2 楼 fuyaping0432 的回复:
定义T的对象的话,不都是这样定义吗 T t(a)?为什么直接用 类名(a), 这样了呢?我这里不理解。请指导。谢谢在。
直接调用构造函数 生成个临时变量 然后throw
我在qt中用的很多 类似于假如设置brush painter->setBrush(QBrush(Qt::black));
作者: qunqun2012 发布时间: 2011-11-30
上面 throw T(a);这里T(a)实际上是在调用T类的构造函数,然后这个构造函数会生成了一个临时对象,throw出这个临时对象?我上面说的不知道对不对。我不明白为什么显示调用就会产生个临时对象。
C/C++ code
class T { public: static int count; T(int _a) { a=_a; count++; } private: int a; }; int T::count=0; int main() { int a=0; cin>>a; try{ if(a<0) { throw T(3); } } catch(T) { cout<<T::count; } }
输入负数 显示1 说明构造了一次 即用T(3)构造的那个对象
作者: sryan 发布时间: 2011-11-30
你说说
catch(T)为什么可以通过,
可以讲一下吗??
我的理解:
main函数帧中有个无名对象:T(a),
然后抛出到了 main函数帧的其他内存位置,也就是拷贝生成了一个临时对象
catch(T t) .... , 你也看到了 主帖中: catch(T ) 是没有对象的,只有类名!!!!
引用 3 楼 sryan 的回复:
引用……
匿名对象是可以捕捉到的
C/C++ code
class T { public: static int count; T(int _a) { a=_a; count++; } private: int a; public: int getA() { return a; } }; int T::count=0; int main() { int a=0; cin>>a; try{ if(a<0) { throw T(3); } } catch(T a) { cout<<T::count<<endl<<a.getA(); } }
负数显示
1
3
作者: sryan 发布时间: 2011-11-30
直接在main中定义对象:T xx; 理解报错!!!
正常,构造函数所致。。。
现在回到 刚才的问题来,,,, catch(T) 中 是匿名或者无名对象, 构造也需要传参数。。。。
参数呢???
引用 7 楼 qunqun2012 的回复:
你说说
catch(T)为什么可以通过,
可以讲一下吗??
我的理解:
main函数帧中有个无名对象:T(a),
然后抛出到了 main函数帧的其他内存位置,也就是拷贝生成了一个临时对象
catch(T t) .... , 你也看到了 主帖中: catch(T ) 是没有对象的,只有类名!!!!
……
作者: qunqun2012 发布时间: 2011-11-30
如果说: 直接调用拷贝构造, 10楼 我回复的帖子,可以无视之, 莫要误导其他人
你看到楼主的 构造函数了, 有参数的
直接在main中定义对象:T xx; 理解报错!!!
正常,构造函数所致。。。
现在回到 刚才的问题来,,,, catch(T) 中 是匿名或者无名对象, 构造也需要传参数。。。。
参数呢???
引用 9 楼 sryan 的回复:
引用 7 楼 qunqun2012 的回复:
你说说
cat……
作者: qunqun2012 发布时间: 2011-11-30
你看到楼主的 构造函数了, 有参数的
直接在main中定义对象:T xx; 理解报错!!!
正常,构造函数所致。。。
现在回到 刚才的问题来,,,, catch(T) 中 是匿名或者无名对象, 构造也需要传参数。。。。
参数呢???
引用 9 楼 sryan 的回复:
引用 7 楼 qunqun2012 的回复:
你说说
cat……
试了下 还真调用了次拷贝构造函数
作者: sryan 发布时间: 2011-11-30
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28