请让我澄清一下,在解释问题时我可能会使用不正确的术语。请耐心等待 - 指出缺陷,但我希望我的问题的本质在线之间传达。
#include <iostream>
#include <exception>
using namespace std;
struct MyException : public exception {
const char * what () const throw () {
return "C++ Exception";
}
};
int main() {
try {
throw MyException();
} catch(MyException& e) {
std::cout << "MyException caught" << std::endl;
std::cout << e.what() << std::endl;
} catch(std::exception& e) {
//Other errors
}
}
我正在尝试学习C ++,之前已经学过C语言。
在上面的代码中,我不理解特定行的语法:
const char * what () const throw ()
我从here读到的内容是
const char *
是返回类型,指向常量字符的指针,按惯例,是以零结尾的字符串数组的第一个字符。
what
是函数名称
()
是一个空参数列表,表示该函数不带参数
const
限定了该函数,因此可以在const
对象上调用它,并且不能直接修改对象的成员
throw ()
是一个例外规范,可以防止它抛出任何异常。
但我不明白的是:
在引用C中的函数时,我们将它们定义为
return_type function_ name
{function_body;
}
所以虽然我理解const char *
这里是返回类型;因此what
必须是function_name;我不明白功能体是什么部分。
我最近意识到C ++中的throw
函数;但为什么在'()'
之后会有what
?如果throw()
是一个函数,那么它的返回类型是什么?我们在这里定义throw()
还是what()
?
答案 0 :(得分:3)
这是一个不推荐使用的动态无抛出说明符。见here。 它不是一个额外的函数调用。它更确定了这个函数的行为,在这种情况下,它是否抛出异常,在这种情况下它不会。
答案 1 :(得分:0)
在引用C中的函数时,我们将它们定义为
return_type function_ name {function_body; }
同样适用于C ++。只是在function_name
和{function_body}
之间也可以有其他可选说明符。
所以虽然我理解
const char *
这里是返回类型;因此what
必须是function_name;
是。
我不明白功能体是什么部分。
正是你所期望的 - 花括号之间的部分:
{ return "C++ Exception"; }
我最近意识到C ++中的
throw
函数;
这不是一个功能。
但为什么在
what
之后会有'()'?
您在问题中已说明的原因:“一个空参数列表,表示该函数不带参数”。
如果throw()是一个函数
不是。符合条件的what()
符合条件,不会抛出任何例外。函数throw
说明符的括号表示函数可能抛出的实际异常类型,如果不允许,它可能为空。
我们在这里定义
throw()
还是what()
?
what()