+ -
当前位置:首页 → 问答吧 → 关于异常类

关于异常类

时间: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 catch
在try代码块内throw了一个T对象 用a来构造它 throw后跳转到对应catchT对象的代码块执行

作者: sryan   发布时间: 2011-11-30

定义T的对象的话,不都是这样定义吗 T t(a)?为什么直接用 类名(a), 这样了呢?我这里不理解。请指导。谢谢在。

作者: fuyaping0432   发布时间: 2011-11-30

引用 2 楼 fuyaping0432 的回复:

定义T的对象的话,不都是这样定义吗 T t(a)?为什么直接用 类名(a), 这样了呢?我这里不理解。请指导。谢谢在。


直接调用构造函数 生成个临时变量 然后throw

我在qt中用的很多 类似于假如设置brush painter->setBrush(QBrush(Qt::black));

作者: sryan   发布时间: 2011-11-30

直接调用构造函数,生成临时变量?麻烦您说的明白一点,我想把这个知识点学明白了。怎么调用构造函数,什么时候生成临时变量。真的感谢。

作者: fuyaping0432   发布时间: 2011-11-30

引用 4 楼 fuyaping0432 的回复:

直接调用构造函数,生成临时变量?麻烦您说的明白一点,我想把这个知识点学明白了。怎么调用构造函数,什么时候生成临时变量。真的感谢。


就是显式调用构造函数来初始化某块内存(对象) 该对象为匿名对象 然后throw它出来

作者: sryan   发布时间: 2011-11-30

上面 throw T(a);这里T(a)实际上是在调用T类的构造函数,然后这个构造函数会生成了一个临时对象,throw出这个临时对象?我上面说的不知道对不对。我不明白为什么显示调用就会产生个临时对象。

作者: fuyaping0432   发布时间: 2011-11-30

你说说 

catch(T)为什么可以通过,


可以讲一下吗??

我的理解:

main函数帧中有个无名对象:T(a),

然后抛出到了 main函数帧的其他内存位置,也就是拷贝生成了一个临时对象 
catch(T t) .... , 你也看到了 主帖中: catch(T ) 是没有对象的,只有类名!!!!



引用 3 楼 sryan 的回复:

引用 2 楼 fuyaping0432 的回复:

定义T的对象的话,不都是这样定义吗 T t(a)?为什么直接用 类名(a), 这样了呢?我这里不理解。请指导。谢谢在。


直接调用构造函数 生成个临时变量 然后throw

我在qt中用的很多 类似于假如设置brush painter->setBrush(QBrush(Qt::black));

作者: qunqun2012   发布时间: 2011-11-30

引用 6 楼 fuyaping0432 的回复:

上面 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

引用 7 楼 qunqun2012 的回复:

你说说

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) 中 是匿名或者无名对象, 构造也需要传参数。。。。

参数呢???





引用 9 楼 sryan 的回复:

引用 7 楼 qunqun2012 的回复:

你说说

catch(T)为什么可以通过,


可以讲一下吗??

我的理解:

main函数帧中有个无名对象:T(a),

然后抛出到了 main函数帧的其他内存位置,也就是拷贝生成了一个临时对象
catch(T t) .... , 你也看到了 主帖中: catch(T ) 是没有对象的,只有类名!!!!



……

作者: qunqun2012   发布时间: 2011-11-30


如果说: 直接调用拷贝构造, 10楼 我回复的帖子,可以无视之, 莫要误导其他人




引用 10 楼 qunqun2012 的回复:

你看到楼主的 构造函数了, 有参数的

直接在main中定义对象:T xx; 理解报错!!!

正常,构造函数所致。。。


现在回到 刚才的问题来,,,, catch(T) 中 是匿名或者无名对象, 构造也需要传参数。。。。

参数呢???





引用 9 楼 sryan 的回复:

引用 7 楼 qunqun2012 的回复:

你说说

cat……

作者: qunqun2012   发布时间: 2011-11-30

引用 10 楼 qunqun2012 的回复:

你看到楼主的 构造函数了, 有参数的

直接在main中定义对象:T xx; 理解报错!!!

正常,构造函数所致。。。


现在回到 刚才的问题来,,,, catch(T) 中 是匿名或者无名对象, 构造也需要传参数。。。。

参数呢???





引用 9 楼 sryan 的回复:

引用 7 楼 qunqun2012 的回复:

你说说

cat……


试了下 还真调用了次拷贝构造函数

作者: sryan   发布时间: 2011-11-30