示例代码(C ++)中的未知异常格式

时间:2016-11-29 21:50:54

标签: c++ exception

tutorialspoint上,底部有一个示例,说明如何创建自己的异常。给出的代码是:

struct MyException : public exception {
   const char * what () const throw () {
       return "C++ Exception";
   }
};

我不明白这是如何格式化的,有两个调用。第一个const表明你将返回一个char *,它将是const,第二个const是为了确保调用的对象(MyException)不会被更改。在通话结束时的throw()上不确定。

使用struct和class来创建自己的异常也有区别吗?

2 个答案:

答案 0 :(得分:1)

  

我认为第一个const表明你将返回一个char *,它将是const

这是正确的。 what()成员函数返回类型const char *的值,该值是指向常量字符的指针。这与任何其他函数返回的值完全相同。如果您不确定如何读取涉及指针和const-specifiers的类型声明,则应study up

  

我认为......第二个const是确保调用的对象(MyException)没有改变。

这也是正确的。当const说明符出现在成员函数的签名末尾时,它指定成员函数在该类型的const个实例上运行。换句话说,这是合法的:

const MyException myex;
std::cout << myex.what() << std::endl;

如果const函数签名中省略what(),则上述代码将是非法的。 myex必须是非常数。

通常,不应该改变对象状态的成员函数应该标记为const,以促进编写const-correct代码。

  

在throw()上不确定。

这是一个C ++ 03风格的异常说明符。空throw()保证函数不会抛出任何异常。 不是函数调用。括号内的原因是因为它可能将异常作为参数。例如,throw(int)表示该函数可能抛出类型int的异常(永远不应该抛出,但这只是一个例子)。

新的C ++ 11样式将是noexcept的注释。这是您在编写现代C ++代码时通常应该使用的,就像其他人一样 评论说。请注意,它不再使用带括号的语法。这是因为广泛认为动态异常规范是无用的,除非在非常特殊的情况下指示函数根本不抛出。

谷歌搜索&#34;异常规范c ++&#34;将返回大量相关信息。

  

使用struct和class来创建自己的异常也有区别吗?

不,没关系。除了默认访问修饰符之外,structclass在C ++中是相同的。也就是说,默认情况下,struct的所有成员都是public,而class的所有成员默认都是private

在C ++中,struct关键字实际上只定义了class。现在,语义,我和其他人喜欢将struct用于POD类型,将class用于其他所有内容,但这不是由语言强制执行的内容。您可以互换使用其中任何一个(除了某些版本的MSVC,它会在看到两个不同的类声明时发出警告,一个使用struct而另一个使用class;这是但是,这是一个无意义的警告,您可以安全地忽略或禁止它。)

答案 1 :(得分:0)

throw ()是一个不推荐使用的“动态异常规范”,它表示函数本身不会抛出任何异常。它的现代等价物是noexcept

如果您使用class代替struct,则需要在函数前插入public: