在下面的代码中,我想测试如果我有一个对象,该对象包含另一个对象,该对象的构造函数会引发异常,将会发生什么情况。但是下面的代码绝对不起作用。控制台上什么也没打印。
class A
{
public:
A()
{
cout << "in A constructor" << endl;
throw "error creating A";
}
~A()
{
cout << "destructing A" << endl;
}
};
class C
{
public:
C()
{
cout <<"in C constructor" << endl;
}
~C()
{
cout << "in C destructor " << endl;
}
};
class B
{
public:
C c;
A a;
B(A a_, C c_): a(a_), c(c_){}
B(){}
};
int main()
{
try{
B b(A, C);
//B b;
}
catch(char const* s)
{
cout <<"catching" << endl;
}
}
如果在try块中,我改用注释的代码,则显示正常。
我也尝试过
B b(A(), C());
什么都没有。
答案 0 :(得分:5)
这是一个函数声明,其返回类型为B
,名称为b
,还有两个类型为A
和C
的未命名参数:
B b(A, C);
与
相同B b(A(), C());
因为名称可以用括号括起来(以允许分组,这在使用例如函数指针等时是必要的),甚至被遗漏的名称也可以用括号括起来。您可以通过
将其转换为类型为b
的变量B
B b(A{}, C{});
在这种情况下,花括号初始化变量的动机之一就是消除歧义。在这里,显然很方便。