在tutorialspoint上,底部有一个示例,说明如何创建自己的异常。给出的代码是:
struct MyException : public exception {
const char * what () const throw () {
return "C++ Exception";
}
};
我不明白这是如何格式化的,有两个调用。第一个const表明你将返回一个char *,它将是const,第二个const是为了确保调用的对象(MyException)不会被更改。在通话结束时的throw()上不确定。
使用struct和class来创建自己的异常也有区别吗?
答案 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来创建自己的异常也有区别吗?
不,没关系。除了默认访问修饰符之外,struct
和class
在C ++中是相同的。也就是说,默认情况下,struct
的所有成员都是public
,而class
的所有成员默认都是private
。
在C ++中,struct
关键字实际上只定义了class
。现在,语义,我和其他人喜欢将struct
用于POD类型,将class
用于其他所有内容,但这不是由语言强制执行的内容。您可以互换使用其中任何一个(除了某些版本的MSVC,它会在看到两个不同的类声明时发出警告,一个使用struct
而另一个使用class
;这是但是,这是一个无意义的警告,您可以安全地忽略或禁止它。)
答案 1 :(得分:0)
throw ()
是一个不推荐使用的“动态异常规范”,它表示函数本身不会抛出任何异常。它的现代等价物是noexcept
。
如果您使用class
代替struct
,则需要在函数前插入public:
。