首页 > 试题广场 >

如何捕获异常可以使得代码通过编译?

[单选题]
如何捕获下面代码中的异常?
class A {
  public:
        A(){}
};
void foo(){
    throw new A;
}
  • catch (A && x)
  • catch (A * x)
  • catch (A & x)
  • 以上都是
throw new A;   throw出的是A *类型的指针所以 catch(A * x);
发表于 2016-03-14 12:04:36 回复(2)
题目中问的是能否通过编译,只有B会捕获到异常,进行异常处理,而A和C由于和throw抛出的异常类型不匹配,导致这个异常不被捕获,从而成为未捕获的异常,调用terminate函数结束程序。
发表于 2015-07-10 11:21:31 回复(6)
仅针对出现的右值引用作下解释,来自百度。

&&就是右值引用, &是普通的左值引用, 左值是可以放在赋值号=左边的值, 右值是只能放在=右边的值, 右值没有一个"变量"名字, i+j返回的值可以视作是放在一个临时存放内存空间里的, 这个空间并不能被用来赋值, 你不能写i+j = 5等; &&可以把这种临时的值和存在变量里的值区分开来


常见应用情况是, 例如String类内部都有一个char *指针pstr指向实际存放字符串的内存, 当写str3 = str1.concat(str2)的时候实际执行了2次构造函数, 第一次是concat构造一个新的String对象, 第二次是赋值的时候执行了一次拷贝构造函数(或者operator=)把concat返回的临时值复制了一次给str3的内存, 然后concat的临时值在之后立即被销毁了, 显然这个第二次拷贝构造很多余

有了&&之后可以给String增加一个参数是&&的拷贝构筑函数以及operator=(&&)来解决这个问题:
String(String &&other) {
    pstr = other.pstr;
    other.pstr = nullptr; //直接把临时值other的pstr拿来用而不再复制一次, 然后把other.pstr置null避免other的析构函数delete pstr
}

发表于 2016-07-29 20:12:57 回复(0)
new的返回类型是指向动态分配内存看thro首地址的指针,故catch这个throw时也是捕获指针类型,不是左右值引用。
发表于 2016-02-25 10:16:32 回复(0)
new A返回的是指向A类存储空间的指针,因此需要声明一个A类指针来catch(A * x)
发表于 2018-08-10 19:31:09 回复(0)
throw:抛出异常信息,类似于执行返回语句,因为它将终止函数的执行,但是它不是将控制权交给调用程序,而是导致程序沿着函数调用序列后退,直到找到包含try块的函数.
catch:类似于函数定义,但并不是函数定义,关键字catch表明这是给一个处理程序, 里面的A *x 会接受throw传过来错误信息.


发表于 2018-07-05 10:13:14 回复(0)
class A{
public:
    A(){}
};
void foo() {throw new A;}
int main()
{
    try{foo();}
    catch(A*x){cout<<"throw A!";}
    return 0;
}
可以编译通过,其他选项都报错
发表于 2017-07-12 09:55:52 回复(1)
抛出的是类型的指针
发表于 2016-05-19 13:46:33 回复(0)
对,A是右值引用,但是new A返回的并不是右值,而是可以修改的左值,所以A无法通过。
C中是对A类对象的引用,故也无法通过编译。

所以我觉得正确答案是B
编辑于 2015-06-11 21:14:44 回复(1)
B C是能通过编译的,但是只有B能捕获到异常。而A无法通过编译的。
发表于 2015-07-22 13:17:16 回复(0)
类型要匹配
发表于 2023-10-20 10:59:57 回复(0)
C++有这玩意儿?
发表于 2023-03-08 09:49:30 回复(1)
new 出来的 变量A  返回的是一个地址,或者说要用同类型的指针去接受这个返回的地址
发表于 2022-09-13 22:26:54 回复(0)

new(新建)用于新建一个对象。new 运算符总是返回一个指针

发表于 2021-06-15 12:37:57 回复(0)
注意,throw关键字已经被C++ 11抛弃
发表于 2020-04-20 11:51:35 回复(0)
thow new A抛出的是指针
发表于 2018-08-26 08:33:04 回复(0)
抛出的是A类的指针?
发表于 2017-08-31 14:54:14 回复(0)
new的对象用指针接
发表于 2016-10-14 18:07:21 回复(0)
new A
new 给数据类型分配一个新结点并返回一个指向新分配内存区的首地址.
所以new A 返回的是一个指针
发表于 2016-09-21 09:38:57 回复(0)
A* 是一个类型
发表于 2016-09-15 21:49:18 回复(0)