无法理解此C ++表达式的语法/结构

时间:2017-10-11 06:51:04

标签: c++ try-catch throw

请让我澄清一下,在解释问题时我可能会使用不正确的术语。请耐心等待 - 指出缺陷,但我希望我的问题的本质在线之间传达。

#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读到的内容是

  1. const char *是返回类型,指向常量字符的指针,按惯例,是以零结尾的字符串数组的第一个字符。

  2. what是函数名称

  3. ()是一个空参数列表,表示该函数不带参数

  4. const限定了该函数,因此可以在const对象上调用它,并且不能直接修改对象的成员

  5. throw ()是一个例外规范,可以防止它抛出任何异常。

  6. 但我不明白的是:

    在引用C中的函数时,我们将它们定义为

    return_type function_ name
      {function_body;
      } 
    

    所以虽然我理解const char *这里是返回类型;因此what必须是function_name;我不明白功能体是什么部分。

    我最近意识到C ++中的throw函数;但为什么在'()'之后会有what?如果throw()是一个函数,那么它的返回类型是什么?我们在这里定义throw()还是what()

2 个答案:

答案 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()